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

这是线

executor.execute(future);

这种方法的javadoc说:

在将来的某个时间执行给定的命令。该命令可以在新线程、池线程或调用线程中执行,由 Executor 实现决定。

于 2012-07-10T07:56:53.147 回答
3

您的基本问题已得到解答,我只想评论executevs. submit

基本上,它们都不能保证立即执行您的代码。如果池中的任务超载,则必须等到队列中的所有先前任务完成后才能执行任务。

现在,您可以看到方法签名的不同之处:

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

因此,提交允许您获取Future参考,您可以稍后使用它来等待任务完成或根据需要取消它。

额外的,为了彻底弄清楚,看看AbstractExecutorService 的源代码,我们可以看到它的实现submit实际上是:

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       }

在第 110 行中,您可以看到它实际上调用execute了 ,因此它们的功能是相同的,以部分为模Future

于 2012-07-10T08:14:08.700 回答
0

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

Executor接口有一个方法execute作为Runnable参数。FutureTask类是 Future 的实现,它实现了 Runnable,因此可以由 Executor 执行。

所以你可以运行下面的代码

executor.execute(future);

于 2012-07-10T08:07:56.910 回答