对于某些处理,需要生成n
个线程并并行运行。在完成所有处理之后,开始处理的主线程应该退出。
以下是代码段:
private void spawnThreads2(int n) throws InterruptedException {
final CountDownLatch latch = new CountDownLatch(n);
final Random random = new Random(System.currentTimeMillis());
for (int i = 1; i <= n; i++) {
final int id = i;
new Thread(){
public void run() {
try {
Thread.sleep(random.nextInt(1000)); // represents processing, can throw any Exception
} catch (Exception e) {}
finally {
latch.countDown();
}
}
}.start();
}
latch.await();
System.out.println("all completed.");
}
countdown()
在finally
块中完成,因此如果发生任何异常,应用程序不会挂起。
await()
?join()
实现相同的功能?我们可以存储线程的所有实例并检查状态并等待。这是一个很好的方法吗。答案 0 :(得分:1)
您应该使用ExecutorService
。你可以通过调用:
ExecutorService executor = Executors.newFixedThreadPool( n );
然后,您可以按照以下步骤开始任务:
executor.submit( runnable );
最后,您可以通过调用shutdown()
方法来停止执行程序。这样做,不再可以添加任何任务,但将执行所有提交的任务。您也可以等待关机:
executor.shutdown();
while ( !executor.isTerminated() ) {
try {
executor.awaitTermination( 5, TimeUnit.SECONDS);
} catch ( InterruptedException e ) {
}
}