Javaスレッド学習07 - 呼び出し可能と未来

 そして、学習の契約は、このヘルプはありコーラブルと未来、非常に興味深いタリアは、結果を得るために、結果を生成します。 


               呼び出し可能インターフェースはRunnableをに似ている、それが名前から見たが、結果を返さないRunnableをすることができ、および例外を投げることができない結果を返しますが、呼び出し可能な機能、より強力な、実行スレッドの後、値を返す、戻り値はすることができそれは簡単な例を見てみましょう、今後は非同期タスクの実行の戻り値を取得することができ、と言うことです、将来を得ることです:
 

public class CallableAndFuture {
    public static void main(String[] args) {
        Callable<Integer> callable = new Callable<Integer>() {
            public Integer call() throws Exception {
                return new Random().nextInt(100);
            }
        };
        FutureTask<Integer> future = new FutureTask<Integer>(callable);
        new Thread(future).start();
        try {
            Thread.sleep(5000);// 可能做一些事情
            System.out.println(future.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

              FutureTaskはRunnableをし、今後の二つのインターフェースを実装し、その両方のスレッドはRunnableをとして実行することができますが、また、今後の呼び出し可能として、戻り値、それが良いものですが、この組み合わせの、その後の使用を取得しますか?そこに計算するのに非常に時間のかかる戻り値があり、すぐに必要とされていない戻り値は、その後、あなたが別のスレッドで戻り値を計算し、この組み合わせを使用することができると仮定し、この戻り値を使用する前に、現在のスレッドは、他の操作を行うことができます操作は、あなたが戻り値を必要とするまで待ってから、今後、ない宮を介して取得します!ます。http://openhome.cc/Gossip/DesignPattern/FuturePattern.htmここで未来のパターンの記述があります。 
 

のは、見てみましょう、呼び出し可能と未来を使用する別の方法ExecutorServiceのコーラブルによって実行される方法を提出し、未来を返し、次のようにコードは次のとおりです。

public class CallableAndFuture {
    public static void main(String[] args) {
        ExecutorService threadPool = Executors.newSingleThreadExecutor();
        Future<Integer> future = threadPool.submit(new Callable<Integer>() {
            public Integer call() throws Exception {
                return new Random().nextInt(100);
            }
        });
        try {
            Thread.sleep(5000);// 可能做一些事情
            System.out.println(future.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

 コードは、ExecutorServiceのはエグゼキュータから継承された多くの単純化されていない、その目的は、私たちは並行プログラミングを簡素化するThreadオブジェクトを管理するために、エグゼキュータのライフサイクルは、我々は表示されませんスレッドが5 JDK後にタスクを開始するための好ましい方法で管理することです。 
       次のように、戻り値を持つ複数のタスクを実行し、戻り値を複数取得します。
 

public class CallableAndFuture {
    public static void main(String[] args) {
        ExecutorService threadPool = Executors.newCachedThreadPool();
        CompletionService<Integer> cs = new ExecutorCompletionService<Integer>(threadPool);
        for(int i = 1; i < 5; i++) {
            final int taskID = i;
            cs.submit(new Callable<Integer>() {
                public Integer call() throws Exception {
                    return taskID;
                }
            });
        }
        // 可能做一些事情
        for(int i = 1; i < 5; i++) {
            try {
                System.out.println(cs.take().get());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
    }
} 

実際には、あなたがCompletionServiceを使用することはできません、あなたは少し、データのコレクションを最後に出て、コードをコレクションにエグゼキュータの戻り値を提出する作業で、機器のコレクションの未来型を作成し、することができます。2016年2月5日に更新され、この文のコメントは議論を引き起こし、実際には、私はそれを明確にしなかった、ごめんなさい。ここで再び手の込んだ:CompletionService未来に提出今後の練習が追加順に配置され、配置を完了するためにありますだから、これらの2つの方法の違いはfishjamで説明したようにレビューのようなものです。
 

 

 

おすすめ

転載: blog.csdn.net/yuhaibao324/article/details/93149639