请参阅以下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()
方法来执行此处的未来任务。但是,如何将任务首先提交给执行程序框架?上面哪一行代码实际上是将任务提交给执行者?
答案 0 :(得分:3)
答案 1 :(得分:3)
您的基本问题已得到解答,我只想对execute
与submit
进行评论。
基本上,它们都不能保证立即执行您的代码。如果池中的任务过载,则必须等到队列中的所有先前任务完成后再执行任务。
现在,您可以看到方法签名的不同之处:
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);