在下面的代码中将任务提交给Executor框架的方法是什么?

时间:2012-07-10 07:52:44

标签: java multithreading synchronization java.util.concurrent

请参阅以下from the Javadoc of Future课程代码:

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

P.S:我这里没有进行任何独家executor.submit(future)电话。

所以我试图通过调用executor.execute()方法来执行此处的未来任务。但是,如何将任务首先提交给执行程序框架?上面哪一行代码实际上是将任务提交给执行者?

3 个答案:

答案 0 :(得分:3)

这是一行

executor.execute(future);
这种方法的

The javadoc说:

  

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

答案 1 :(得分:3)

您的基本问题已得到解答,我只想对executesubmit进行评论。

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

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

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

因此,提交允许您获取Future引用,您可以在以后使用该引用等待任务完成或取消它。

奖励,为了完全清楚,看看source of 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部分为模。

答案 2 :(得分:0)

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

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

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

executor.execute(future);