并行处理N个线程,最后主线程退出
Processing N threads in parallel and main threads exits in the end
对于某些处理,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()
实现相同的功能?我们可以存储线程的所有实例并检查状态并等待。这是一个很好的方法吗?
你应该使用 ExecutorService
。您可以通过调用以下方式使用 n 个线程获得一个:
ExecutorService executor = Executors.newFixedThreadPool( n );
然后,您可以开始如下任务:
executor.submit( runnable );
最后可以调用shutdown()
方法停止executor。这样做后,将无法再添加任何任务,但将执行所有提交的任务。您也可以等待关机:
executor.shutdown();
while ( !executor.isTerminated() ) {
try {
executor.awaitTermination( 5, TimeUnit.SECONDS);
} catch ( InterruptedException e ) {
}
}
对于某些处理,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()
实现相同的功能?我们可以存储线程的所有实例并检查状态并等待。这是一个很好的方法吗?
你应该使用 ExecutorService
。您可以通过调用以下方式使用 n 个线程获得一个:
ExecutorService executor = Executors.newFixedThreadPool( n );
然后,您可以开始如下任务:
executor.submit( runnable );
最后可以调用shutdown()
方法停止executor。这样做后,将无法再添加任何任务,但将执行所有提交的任务。您也可以等待关机:
executor.shutdown();
while ( !executor.isTerminated() ) {
try {
executor.awaitTermination( 5, TimeUnit.SECONDS);
} catch ( InterruptedException e ) {
}
}