(八)CallableとFuture


Callableはパラメータ化されたタイプで、一つの方法しかないです。public interface Callable<V>{    V call()throw Exception;)Futureは非同期計算の結果を保存して、計算を開始して、Futureオブジェクトをあるスレッドに渡して、それを忘れます。Futureオブジェクトの所有者は、結果計算が完了すると獲得できます。public interface Future<V>{    bollan cancel(bootan mayInterrupt IfRunning);    bootlean isCancelled();    bootlean isdone()    V get()throws InterruptedException、Execution Exception;    V get(long timeout、TimeUnit unit)throws InterruptedException、Execution Exception、Timeout Exception;}最初のget方法の呼び出しは計算が完了するまでブロックされます。第二のget方法は、計算が完了する前にタイムアウトを呼び出すと、Timeout Exceptionの異常が発生します。この計算を実行するスレッドが中断されると、両方の方法がInterruptedExceptionから投げ出されます。計算が完了すればget方法はすぐに戻ります。計算がまだ行われている場合、isDoone()方法はfalseに戻ります。完成したらtrueに戻ります。キャンセル方法はこの計算をキャンセルするために使用されます。計算がまだ始まっていない場合は、キャンセルされて開始しません。計算が実行中であれば、mayInterruptIfRunningパラメータがtrueであれば、中断されます。FutureTask包装器は非常に便利な機構であり、CallableをFutureとRunnableに変換でき、同時に両者のインターフェースを実現します。
    Callable<Integer> myComputation = new CallableSon<Integer>();
    FutureTask<Integer> task = new FutureTask<Integer>(myComputation);
    Thread t = new Thread(task);
    t.start();
    ... ...
    Integer result = task.get();
 
なお、FutureとCallableを使用するにはFutureTaskを経由しなければなりません。Threadは、Runnableインターフェースクラスを実現した例しか入ってこないので、FutureTaskはRunnableを実現しました。