并行处理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 块中完成,因此如果发生任何异常,应用程序不会挂起。

  1. 这种设计适合创建线程并等待它们吗?由于 await()?
  2. ,应用程序是否有可能挂起并且永远不会出现
  3. 有没有一种方法可以使用 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 ) {
    }
}