0

Futureクラスの Javadocの次のコードを参照してください。

FutureTask<String> future =
   new FutureTask<String>(new Callable<String>() {
     public String call() {
       return searcher.search(target);
   }});
 executor.execute(future);

PS: 私はexecutor.submit(future)ここで排他的な呼び出しを行っていません。

そこで、ここでメソッドを呼び出して将来のタスクを実行しようとしていますexecutor.execute()。しかし、そもそもどのようにしてタスクがエグゼキューター フレームワークにサブミットされるのでしょうか? 上記のコードのどの行が実際にタスクをエグゼキュータに送信していますか?

4

3 に答える 3

3

Your base question was answered, I just want to comment on execute vs. submit.

Basically neither of them are guaranteed to execute your code immediately. If the pool is overloaded with tasks, it will have to wait until all the previous tasks in the queue are finished before executing your task.

Now, you can see the difference in method signature:

void execute(Runnable command) 
public Future<?> submit(Runnable task)

Hence, submit allows you to get a Future reference that you can later use to wait for the task to finish or cancel it if you want.

Bonus, to fully clear things up, having a look at the source of AbstractExecutorService, we can see that the implementation of submit is in fact:

103       /**
104        * @throws RejectedExecutionException {@inheritDoc}
105        * @throws NullPointerException       {@inheritDoc}
106        */
107       public Future<?> submit(Runnable task) {
108           if (task == null) throw new NullPointerException();
109           RunnableFuture<Void> ftask = newTaskFor(task, null);
110           execute(ftask);
111           return ftask;
112       }

In line 110 you can see that it actually calls execute, therefore their functionality is identical, modulo the Future part.

于 2012-07-10T08:14:08.700 に答える
3

それはラインです

executor.execute(future);

このメソッドの javadocは次のように述べています。

将来のある時点で指定されたコマンドを実行します。コマンドは、Executor 実装の裁量で、新しいスレッド、プールされたスレッド、または呼び出し元のスレッドで実行できます。

于 2012-07-10T07:56:53.147 に答える
0

I am not doing any exclusive executor.submit(future)

Executorインターフェイスには、パラメーターとして受け取るメソッドが1つexecuteあります。FutureTaskクラスは、Runnableを実装するFutureの実装であるため、Executorによって実行される場合があります。Runnable

したがって、以下のコードを実行できます

executor.execute(future);

于 2012-07-10T08:07:56.910 に答える