当前位置: 首页 > 面试题库 >

JavaExecutorService,如何等待所有任务完成

闻人伟
2023-03-14
问题内容

等待所有任务ExecutorService完成的最简单方法是什么?我的任务主要是计算,所以我只想运行大量的作业-每个内核上一个。现在,我的设置如下所示:

ExecutorService es = Executors.newFixedThreadPool(2);
for (DataTable singleTable : uniquePhrases) {   
    es.execute(new ComputeDTask(singleTable));
}
try{
    es.wait();
} 
catch (InterruptedException e){
    e.printStackTrace();
}

ComputeDTask实现可运行。这似乎是正确执行的任务,但代码崩溃上wait()IllegalMonitorStateException。这很奇怪,因为我玩了一些玩具示例,而且看起来很奏效。

uniquePhrases包含数以万计的元素。我应该使用其他方法吗?我正在寻找尽可能简单的东西


问题答案:

最简单的方法是使用ExecutorService.invokeAll()单行代码执行所需的操作。用你的话来说,你需要修改或包装ComputeDTask以实现Callable<>,这可以给你带来更大的灵活性。可能在你的应用中实现的有意义的实现Callable.call(),但是如果不使用,则可以通过以下方式包装它Executors.callable()

ExecutorService es = Executors.newFixedThreadPool(2);
List<Callable<Object>> todo = new ArrayList<Callable<Object>>(singleTable.size());

for (DataTable singleTable: uniquePhrases) { 
    todo.add(Executors.callable(new ComputeDTask(singleTable))); 
}

List<Future<Object>> answers = es.invokeAll(todo);

正如其他人指出的那样,invokeAll()如果合适,你可以使用的超时版本。在此示例中,answers将包含一堆Futures,这些s将返回空值(请参阅的定义Executors.callable()。可能要做的是稍微重构,以便你可以html" target="_blank">返回有用的答案或对基础的引用ComputeDTask,但是我可以从你的例子中看不出来。

如果不清楚,请注意,invokeAll()直到完成所有任务后该操作才会返回。(即,如果需要,将报告Futureanswers集合中的所有s .isDone()。)这避免了所有手动关闭,awaitTermination等…,并允许你ExecutorService根据需要在多个循环中整齐地重用此方法。



 类似资料:
  • 问题内容: 我只希望我的主线程在退出之前等待我所有的(p)线程完成。 线程来回移动的原因很多,我真的不想跟踪所有线程-我只想知道线程什么时候消失了。 wait()对子进程执行此操作,在没有子进程时返回ECHILD,但是wait(似乎不与(p)个线程一起工作)。 我真的不想麻烦保留每个未完成线程的列表(随它们来来去去),然后必须在每个线程上调用pthread_join。 有没有一种快速而又肮脏的方式

  • 我正在使用Spring 4.3.8。发布Java7。我想创建一个线程工厂来帮助管理应用程序中的某些工作人员。我像这样声明我的线程工厂 但是,我在线程上“加入”有困难。也就是说,我想在继续某个任务之前等待所有工作完成,所以我有 我的线程池是这样执行的 然而打印出来的是 所以很明显我没有等待。等待我的线程完成工作的正确方法是什么?

  • 我正在使用Aerospike AsyncClient和Aerospike UDF模块在Aerospike 2节点集群中使用多线程插入1000万条记录。我遵循的步骤是: > 创建了一个由10个线程组成的executor服务,所有线程都将使用相同的AsyncClient 运行循环1000万次,并使用下面的代码调用execute命令 对于(int 1-0;i<10000000;i++){final in

  • 有时我看到一些线程还没有完成他们的工作,服务杀死那个线程,我怎么能强迫服务等待,直到线程完成他们的工作? 这是我的代码: 我看到了一些例外。future.is完成())块。我怎么能确保每一个未来是当执行者服务关闭?

  • 问题内容: 我的问题与这里的这个问题密切相关。如此处所述,我希望主线程等待,直到工作队列为空并且所有任务都已完成。但是,我的情况是每个任务都可能递归地导致新任务被提交进行处理。这使得收集所有这些任务的未来变得有点尴尬。 我们当前的解决方案使用忙等待循环来等待终止: numTasks是随着创建每个新任务而增加的值。这可以工作,但是由于繁忙的等待,我认为它不是很好。我想知道是否有一个好方法可以使主线程

  • 问题内容: 如何让我的代码等待,直到DispatchQueue中的任务完成?是否需要任何CompletionHandler或其他东西? 我正在使用Xcode 8.2并在Swift 3中编写。 问题答案: 使用s可以实现这一点。您可以在群组和通话达到平衡时得到通知: 或者您可以等待: 注意 :阻止当前队列(在您的情况下可能是主队列),因此您必须在另一个队列上(如上面的示例代码中)以避免 死锁 。