我需要一次执行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
我正在编写我正在编写的代码中的常见模式,我需要等待组中的所有线程完成,并且超时.超时应该是所有线程完成所需的时间,因此简单地为每个线程执行thread.Join(timeout)将不起作用,因为可能的超时是超时*numThreads.
现在我做类似以下的事情:
var threadFinishEvents = new List<EventWaitHandle>();
foreach (DataObject data in dataList)
{
// Create local variables for the thread delegate
var threadFinish = new EventWaitHandle(false, EventResetMode.ManualReset);
threadFinishEvents.Add(threadFinish);
var localData = (DataObject) data.Clone();
var thread = new Thread(
delegate()
{
DoThreadStuff(localData);
threadFinish.Set();
}
);
thread.Start();
}
Mutex.WaitAll(threadFinishEvents.ToArray(), timeout);
Run Code Online (Sandbox Code Playgroud)
但是,对于这种事情,似乎应该有一个更简单的习语.
我将根据for循环中的用户输入创建多个线程.因此我无法为它们指定名称.有没有办法等待所有人完成继续我的主线程?我想让他们完成那个for循环.我知道我需要使用连接但是有很多线程,我将如何使用它?或者还有另一种方式吗?它会是这样的:
for(int i = 0; i<inputs.size(); i++)
new SimpleThread(parameters).start();
Run Code Online (Sandbox Code Playgroud)
继续只有主线程,其他人完成.
我怎样才能做到这一点?