我需要一次执行4个任务,如下所示:
ExecutorService taskExecutor = Executors.newFixedThreadPool(4);
while(...) {
taskExecutor.execute(new MyTask());
}
//...wait for completion somehow
Run Code Online (Sandbox Code Playgroud)
一旦完成所有内容,我该如何收到通知?现在我想不出比设置一些全局任务计数器更好的事情,并在每个任务结束时减少它,然后在无限循环中监视这个计数器变为0; 或获得一个Futures列表,并在无限循环监视器isDone中为所有这些.什么是更好的解决方案不涉及无限循环?
谢谢.
java parallel-processing concurrency multithreading executorservice
等待ExecutorService完成所有任务的最简单方法是什么?我的任务主要是计算,所以我只想运行大量的工作 - 每个核心一个.现在我的设置如下:
ExecutorService es = Executors.newFixedThreadPool(2);
for (DataTable singleTable : uniquePhrases) {
es.execute(new ComputeDTask(singleTable));
}
try{
es.wait();
}
catch (InterruptedException e){
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
ComputeDTask实现runnable.这似乎正确执行任务,但代码崩溃wait()了IllegalMonitorStateException.这很奇怪,因为我玩了一些玩具示例,它似乎工作.
uniquePhrases包含数万个元素.我应该使用其他方法吗?我正在寻找尽可能简单的东西
简单地等待所有线程进程完成的方法是什么?例如,假设我有:
public class DoSomethingInAThread implements Runnable{
public static void main(String[] args) {
for (int n=0; n<1000; n++) {
Thread t = new Thread(new DoSomethingInAThread());
t.start();
}
// wait for all threads' run() methods to complete before continuing
}
public void run() {
// do something here
}
}
Run Code Online (Sandbox Code Playgroud)
我如何改变这一点,以便main()方法在注释处暂停,直到所有线程的run()方法都退出?谢谢!
我的问题与此问题密切相关.正如在那里发布的那样,我希望主线程等到工作队列为空并且所有任务都已完成.然而,在我的情况下,问题是每个任务可以递归地导致提交新任务以进行处理.这使收集所有这些任务的未来变得有点尴尬.
我们当前的解决方案使用忙等待循环来等待终止:
do { //Wait until we are done the processing
try {
Thread.sleep(200);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
} while (!executor.getQueue().isEmpty()
|| numTasks.longValue() > executor.getCompletedTaskCount());
Run Code Online (Sandbox Code Playgroud)
numTasks是一个在创建每个新任务时增加的值.这有效但我认为由于忙碌的等待而不是很好.我想知道是否有一种好方法可以使主线程同步等待,直到被明确唤醒.
我正在尝试编写一个多线程的Web爬虫.
我的主要入门类有以下代码:
ExecutorService exec = Executors.newFixedThreadPool(numberOfCrawlers);
while(true){
URL url = frontier.get();
if(url == null)
return;
exec.execute(new URLCrawler(this, url));
}
Run Code Online (Sandbox Code Playgroud)
URLCrawler获取指定的URL,解析HTML从中提取链接,并将看不见的链接安排回边界.
边界是未抓取的URL队列.问题是如何编写get()方法.如果队列为空,则应等待任何URLCrawlers完成,然后再次尝试.仅当队列为空且当前没有活动的URLCrawler时,它才应返回null.
我的第一个想法是使用AtomicInteger来计算当前工作URLCrawler的数量以及notifyAll()/ wait()调用的辅助对象.开始时每个爬虫都会增加当前工作URLCrawler的数量,并在退出时递减它,并通知对象它已完成.
但我读到notify()/ notifyAll()和wait()是一些不赞成做线程通信的方法.
我应该在这个工作模式中使用什么?它类似于M生产者和N个消费者,问题是如何处理生产者的匮乏.
如何检查提交的所有任务是否ThreadPoolExecutor已完成?
新的任务可以从以前提交的任务被加入,所以我不能把shutdown后面awaitTermination也没有invokeAll,因为它会忽略这些新的任务.