JavaマルチスレッドのPromiseモード

5123 ワード

参考ドキュメント:Javaマルチスレッドプログラミングモード実戦ガイドのPromiseモード
今日は『Javaマルチスレッドプログラミングモード実戦ガイドのPromiseモード』という文章を見て、いい感じで、futureというものを以前にも知っていましたが、理解はそんなに深くなく、jQueryのpromiseを連想して、ドキュメントのコードで試してみることにしました.次のコードを貼り付けます.
package com.yuzx.test.promise;

import org.junit.Test;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;

/**
 * Created by yuzx on 15-12-11.
 */
public class PromiseTestMain {

    private static class FtpClient {

        private FtpClient() {

        }

        public static Future newFtpClient(final String serverName, final String username, final String password) {
            Callable callable = new Callable() {
                @Override
                public FtpClient call() throws Exception {
                    System.out.println("work 1.");
                    FtpClient ftpClient = new FtpClient();
                    ftpClient.init(serverName, username, password);

                    return ftpClient;
                }
            };

            FutureTask promise = new FutureTask(callable);

            new Thread(promise).start();

            //      ,          
            return promise;
        }

        private void init(String serverName, String username, String password) throws InterruptedException {
            Thread.sleep(5000);
        }

        private void printWork2(int res) {
            System.out.println("res is " + res);
        }
    }

    //          
    private int work2() throws InterruptedException {
        System.out.println("work 2.");
        Thread.sleep(3000);

        return 109;
    }

    /**
     *           Promise,        
     *
     * @throws InterruptedException
     * @throws ExecutionException
     */
    @Test
    public void doTest() throws InterruptedException, ExecutionException {
        Future promise = FtpClient.newFtpClient("10.0.3.242", "yuzx", "pAs$w0rd");
        int res = work2();
        promise.get().printWork2(res);

        FtpClient ftpClient = null;
        try {
            //         FTP     
            ftpClient = promise.get();
        } catch (InterruptedException e) {
            ;
        } catch (ExecutionException e) {
            throw new RuntimeException(e);
        }
    }
}

時間のかかる操作をpromiseとしてカプセル化し、Taskを並列に実行することができ、Job全体にかかる時間は、すべてのTaskの時間とではなく、最も長いTaskの時間であるべきである.