并行处理N个线程,最后退出主线程

时间:2016-01-15 07:51:16

标签: java multithreading countdown

对于某些处理,需要生成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. 有没有办法可以使用join()实现相同的功能?我们可以存储线程的所有实例并检查状态并等待。这是一个很好的方法吗。

1 个答案:

答案 0 :(得分:1)

您应该使用ExecutorService。你可以通过调用:

获得一个使用n个线程的线程
ExecutorService executor = Executors.newFixedThreadPool( n );

然后,您可以按照以下步骤开始任务:

executor.submit( runnable );

最后,您可以通过调用shutdown()方法来停止执行程序。这样做,不再可以添加任何任务,但将执行所有提交的任务。您也可以等待关机:

executor.shutdown();

while ( !executor.isTerminated() ) {
    try {
        executor.awaitTermination( 5, TimeUnit.SECONDS);
    } catch ( InterruptedException e ) {
    }
}