如何等待多个Callables而不阻塞get()

时间:2015-08-10 10:28:06

标签: java runnable future executorservice callable

我正在使用java Callable ExecutorService 执行计算:

ExecutorService threadExecutor = Executors.newCachedThreadPool();
for (TaskCallable task: tasks) {
    threadExecutor.submit(task);
}

我想让任务最多运行2分钟。但如果我打电话:

task.get(2, TimeUnit.MINUTES);

那么它会立即阻止!并且不要让我为其他任务分配超时,直到超时结束。

我可以用

threadExecutor.invokeAll(tasks, 2, TimeUnit.MINUTES);

但它会返回未来列表,我不知道哪个任务属于哪个Future。

2 个答案:

答案 0 :(得分:0)

使用Try this:- private boolean mHasRequestedMore; private int preLast; listView.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (!mHasRequestedMore) { final int lastItem = firstVisibleItem + visibleItemCount; if (lastItem == totalItemCount) { if (preLast != lastItem) { preLast = lastItem; loadMore(); } } } } ); 。来自docs:

  

阻止所有任务在关闭后完成执行   请求,或发生超时,或当前线程被中断,   以先到者为准。

awaitTermination

答案 1 :(得分:0)

你可以使用invokeAll,因为文档说:

  

返回:
      表示任务的Futures列表,与迭代器为给定任务列表生成的顺序相同,每个都已完成。

当你记住两件事时,一切都按预期工作:

  • 仅将invokeAll用于具有保证顺序的Collection(例如,ArrayList且没有HashMap)
  • 当你遍历FutureList时,你必须检查你的Future取消(!Future.isCancelled()),否则抛出CancellationException