Java多线程------让主线程等待所有子线程执行完毕

发表于:2012-5-02 10:07

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

分享:

  打印结果:

  main开始
  Thread-2开始...
  Thread-1开始...
  Thread-0开始...
  Thread-3开始...
  Thread-5开始...
  Thread-4开始...
  Thread-5结束. 还有5 个线程
  Thread-1结束. 还有4 个线程
  Thread-4结束. 还有3 个线程
  Thread-2结束. 还有2 个线程
  Thread-3结束. 还有1 个线程
  Thread-0结束. 还有0 个线程
  main结束.

  更简单的方法:使用java.util.concurrent.CountDownLatch代替MyCountDown,用await()方法代替while(true){...}

  ImportThread类

public class ImportThread extends Thread {   
  1. private CountDownLatch threadsSignal;   
  2. public ImportThread(CountDownLatch threadsSignal) {   
  3. this.threadsSignal = threadsSignal;   
  4. }   
  5. @Override  
  6. public void run() {   
  7. System.out.println(Thread.currentThread().getName() + "开始...");   
  8. //Do somethings   
  9. threadsSignal.countDown();//线程结束时计数器减1   
  10. System.out.println(Thread.currentThread().getName() + "结束. 还有" + threadsSignal.getCount() + " 个线程");   
  11. }   
  12. }

    public class ImportThread extends Thread {
    private CountDownLatch threadsSignal;
    public ImportThread(CountDownLatch threadsSignal) {
    this.threadsSignal = threadsSignal;
    }
    @Override
    public void run() {
    System.out.println(Thread.currentThread().getName() + "开始...");
    //Do somethings
    threadsSignal.countDown();//线程结束时计数器减1
    System.out.println(Thread.currentThread().getName() + "结束. 还有" + threadsSignal.getCount() + " 个线程");
    }
    }

  主线程中

CountDownLatch threadSignal = new CountDownLatch(threadNum);//初始化countDown  
  1. for (int ii = 0; ii < threadNum; ii++) {//开threadNum个线程  
  2. final Iterator<String> itt = it.get(ii);   
  3. Thread t = new ImportThread(itt,sql,threadSignal);   
  4. t.start();   
  5. }   
  6. threadSignal.await();//等待所有子线程执行完   
  7. System.out.println(Thread.currentThread().getName() + "结束.");//打印结束标记

    CountDownLatch threadSignal = new CountDownLatch(threadNum);//初始化countDown
    for (int ii = 0; ii < threadNum; ii++) {//开threadNum个线程
    final Iterator<String> itt = it.get(ii);
    Thread t = new ImportThread(itt,sql,threadSignal);
    t.start();
    }
    threadSignal.await();//等待所有子线程执行完
    System.out.println(Thread.currentThread().getName() + "结束.");//打印结束标记

  打印结果:

  main开始
  Thread-1开始...
  Thread-0开始...
  Thread-2开始...
  Thread-3开始...
  Thread-4开始...
  Thread-5开始...
  Thread-0结束. 还有5 个线程
  Thread-1结束. 还有4 个线程
  Thread-4结束. 还有3 个线程
  Thread-2结束. 还有2 个线程
  Thread-5结束. 还有1 个线程
  Thread-3结束. 还有0 个线程
  main结束.

44/4<1234
精选软件测试好文,快来阅读吧~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号