Java主线程等待所有子线程执行完毕再执行解决办法(转)

时间:2022-12-14 23:20:21
Java主线程等待所有子线程执行完毕再执行解决办法(转)

方法一:

Thread.join()方法,亲测可行,thread.join()方法

  1. Vector<Thread> ts = new Vector<Thread>();
  2. for (int i = 0; i < 200; i++) {
  3. Thread t = new Thread(new Runnable() {
  4. @Override
  5. public void run() {
  6. Counter.inc();
  7. }
  8. });
  9. ts.add(t);
  10. t.start();
  11. }
  12. for (Thread t : ts) {
  13. try {
  14. t.join();
  15. } catch (InterruptedException e) {
  16. // TODO Auto-generated catch block
  17. e.printStackTrace();
  18. }
  19. }
  20. System.out.println("----------" + Counter.count);

(全部代码见上一篇文章)

这个循环中的join的意思是:子线程排好队,欢迎新同学main线程,main线程对着排好队的他们说,我站你后边,我站你后边,我站你后边。。。。(ts.size()次)。然后站到最后一个的后面了。恩、

方法二:

用线程池。

代码:

  1. ExecutorService threadPool = Executors.newScheduledThreadPool(10);
  2. ExecutorService threadPool = Executors.newCachedThreadPool();
  3. for (int i = 0; i < 200; i++) {
  4. threadPool.execute(new Runnable() {
  5. @Override
  6. public void run() {
  7. chi.inc();
  8. }
  9. });
  10. }
  11. threadPool.shutdownNow();
  12. try {
  13. threadPool.awaitTermination(3, TimeUnit.MICROSECONDS);
  14. } catch (InterruptedException e) {
  15. e.printStackTrace();
  16. }
  17. System.out.println("------" + chi.count);

Executors是个工厂,(工厂模式),创建出几种不同类别的线程池。这里我用ScheduledThreadPool。(因为好使,注释掉的那种不知为什么不管用)。

然后用shutdownNow(),这个方法是马上停止(试图)正在执行的任务,线程池进入STOP状态,不再开启正在等待的线程。

对比的,shutdown()方法是阻止等待中的进程开启,等待所有正在执行的进程完成。