我试图计算一些指标,一旦myclass中的所有线程都完成,一旦我达到超时场景,就可以为线程完成工作,我可以为每个线程命中。现在,在Group类的main()方法中,我如何等待所有myclass线程完成?
我不想使用任何sleep()方案
Group Class
class myGroup {
public void run(int numThreads) {
executor = Executors.newFixedThreadPool(numThreads);
executor.submit(new myclass(threadNumber));
}
public static void main(String[] args) {
run(noOfthreads);
// Collect metrics once all the myclass threads are done.
}
}
myclass
class myclass implements Runnable {
try{
}
catch(SomeTimeoutException cte){
// Job Done for thread
}
}
可以这样做:
List<myclass> tasks = makeAListOfMyClassTasks();
// this will kick off all your tasks at once:
List<Future<myclass>> futures = executor.invokeAll(tasks);
// this will wait until all your tasks are done, dead, or the specified time has passed
executor.awaitTermination(10, TimeUnit.MINUTES); // change this to your liking
// check each Future to see what the status of a specific task is and do something with it
for (Future<myclass> future : futures) {
if (future.isCancelled()) {
// do something
} else if (future.isDone()) {
myclass task = future.get(); // this will block if it's not done yet
task.whatever();
}
}
@beatngu13还指出了这个漂亮的类ExecutorCompletionService;所以你可以这样做:
List<myclass> tasks = makeAListOfMyClassTasks();
CompletionService<Result> ecs = new ExecutorCompletionService<Result>(exectuor);
for (myclass t : tasks) {
// this kicks off the task and returns a Future, which you could gather
ecs.submit(t);
}
for (int i = 0; i < tasks.length(); i ++) {
myclass task = ecs.take().get(); // this will block until the next task is done/dead
// ... do something with task
}
期货信息:https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html
这里有ExecutorService的例子:https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html
这个相关的线程非常相关:ExecutorService,如何等待所有任务完成