6

Callable別のスレッドで実行されたときに a が値を返す方法を理解しようとしています。

クラスExecutorsAbstractExecutorServiceThreadPoolExecutorおよびを探しています。FutureTaskすべてjava.util.concurrentパッケージで利用できます。

Executor でメソッドを呼び出して ExecutorService オブジェクトを作成します (例: newSingleThreadExecutor())。次に、 Callable オブジェクトを で渡すことができます ExecutorService.submit(Callable c)

call()メソッドは によって提供されるスレッドによって実行されるため、ExecutorService返されたオブジェクトはどこで呼び出し元のスレッドに「ジャンプ」しますか?

次の簡単な例を見てください。

1    ExecutorService executor = Executors.newSingleThreadExecutor();
2    public static void main(String[] args) {
3       Integer i = executor.submit(new Callable<Integer>(){
4           public Integer call() throws Exception {
5              return 10;
6           }
7       }).get();
8       System.out.print("Returns: " + i + " Thread: " + Thread.currentThread.getName());
9       // prints "10 main"
10    }

System.out別のスレッドで実行される call メソッドの整数を Integer オブジェクト (行 3) に返して、メイン スレッド (行 7) のステートメントで出力できるようにするにはどうすればよいでしょうか?

ExecutorServiceがそのスレッドを実行する前にメイン スレッドを実行して、 System.out statementnull を出力することはできませんか?

4

2 に答える 2

8

別のスレッドによって実行される call メソッドの整数が Integer オブジェクトに返される可能性はありますか?

ExecutorService.submit(...)はオブジェクトを返しませcall()が、 aFuture<Integer>を返します。メソッドを使用しFuture.get()てそのオブジェクトを取得できます。以下のコード例を参照してください。

System.out ステートメントが null を出力するように、ExecutorService がそのスレッドを実行する前にメイン スレッドを実行することはできませんか?

いいえ、get()将来のメソッドはジョブが終了するまで待機します。call()null が返された場合get()、それ以外の場合は返される (および出力される)ことが10保証されます。

Future<Integer> future = executor.submit(new Callable<Integer>(){
    public Integer call() throws Exception {
       return 10;
    }
});
try {
   // get() waits for the job to finish before returning the value
   // it also might throw an exception if your call() threw
   Integer i = future.get();
   ...
} catch (ExecutionException e) {
   // this cause exception is the one thrown by the call() method
   Exception cause = e.getCause();
   ...
}
于 2012-08-10T14:14:17.550 に答える
4

ExecutorService.submit()メソッドを見てください:

<T> Future<T> submit(Callable<T> task): 実行のために値を返すタスクを送信し、タスクの保留中の結果を表す Future を返します。Future の get メソッドは、正常に完了するとタスクの結果を返します。タスクの待機をすぐにブロックしたい場合は、フォームの構造を使用できますresult = exec.submit(aCallable).get();


Q. ExecutorService がそのスレッドを実行する前にメイン スレッドを実行して、System.out ステートメントが null を出力することはできませんか?

--> Future<T>.get()必要に応じて計算が完了するまで待機し、その結果を取得します。

于 2012-08-10T14:18:27.330 に答える