用CountDownLatch实现主线程等待子线程
2015-03-31 15:23
351 查看
多线程中,主线程先等待,等待其他子线程运行结束才执行。
如果不加限制,主线程和子线程是并发执行的,主线程并没有等待。若果碰到求“总的所有线程运行时间”,“线程运行结束才进行显示的语句”等业务要求,则不能满足。
3.1)对于只有一个子线程,如果主线程需要等待子线程执行完成,再继续向下执行,可以使用Thread的join()方法。
3.2)对于多个子线程,比如主线程需要等待5个子线程,这5个线程之间是并发执行。
要想子线程之间能并发执行,那么需要在所有子线程start()后,在执行所有子线程的join()方法。
3.3)CountDownLatch实现
CountDownLatch是java.util.concurrent中的一个同步辅助类,可以把它看做有多个锁的闸门。初始化时先设置一个闭锁数初始值(子线程数目),每调用一次countDown()方法,闸门打开一道闭锁,即闭锁数减一,await()方法会阻塞当前进程,直到闭锁减为0,闸门完全打开,执行后续代码。
//一个子线程样例:
class InsertOrgUserWorker implements Runnable{
private CountDownLatch countDownLatch;
private List uumUsers=null;
InsertOrgUserWorker(List uumUsers,CountDownLatch countDownLatch){
this.uumUsers=uumUsers;
this.countDownLatch=countDownLatch;
}
public void run(){
//向uum_org_user 表中插入数据
InitUumUser.insertUumOrgUser(uumUsers);
countDownLatch.countDown();
}
}
//主线程中:
CountDownLatch countDownLatch=new CountDownLatch(2);//2个线程,加2个闭锁
//向uum_org_user 表中插入数据
InsertOrgUserWorker orgUserRunnable=new InsertOrgUserWorker(uumUsers,countDownLatch);
new Thread(orgUserRunnable).start();
//向uum_tenement_user 表中插入数据
InsertTenementUserWorker tenementUserRunnable=new InsertTenementUserWorker(uumUsers,countDownLatch);
new Thread(tenementUserRunnable).start();
// 阻塞当前线程,直到闭锁减少到0,打开锁
countDownLatch.await();
ta.append("导入主账号信息成功\n");
ta.append("本次一共向uum_user表中写入"+uumUsers.size()+"条信息\n");
如果不加限制,主线程和子线程是并发执行的,主线程并没有等待。若果碰到求“总的所有线程运行时间”,“线程运行结束才进行显示的语句”等业务要求,则不能满足。
3.1)对于只有一个子线程,如果主线程需要等待子线程执行完成,再继续向下执行,可以使用Thread的join()方法。
3.2)对于多个子线程,比如主线程需要等待5个子线程,这5个线程之间是并发执行。
要想子线程之间能并发执行,那么需要在所有子线程start()后,在执行所有子线程的join()方法。
3.3)CountDownLatch实现
CountDownLatch是java.util.concurrent中的一个同步辅助类,可以把它看做有多个锁的闸门。初始化时先设置一个闭锁数初始值(子线程数目),每调用一次countDown()方法,闸门打开一道闭锁,即闭锁数减一,await()方法会阻塞当前进程,直到闭锁减为0,闸门完全打开,执行后续代码。
//一个子线程样例:
class InsertOrgUserWorker implements Runnable{
private CountDownLatch countDownLatch;
private List uumUsers=null;
InsertOrgUserWorker(List uumUsers,CountDownLatch countDownLatch){
this.uumUsers=uumUsers;
this.countDownLatch=countDownLatch;
}
public void run(){
//向uum_org_user 表中插入数据
InitUumUser.insertUumOrgUser(uumUsers);
countDownLatch.countDown();
}
}
//主线程中:
CountDownLatch countDownLatch=new CountDownLatch(2);//2个线程,加2个闭锁
//向uum_org_user 表中插入数据
InsertOrgUserWorker orgUserRunnable=new InsertOrgUserWorker(uumUsers,countDownLatch);
new Thread(orgUserRunnable).start();
//向uum_tenement_user 表中插入数据
InsertTenementUserWorker tenementUserRunnable=new InsertTenementUserWorker(uumUsers,countDownLatch);
new Thread(tenementUserRunnable).start();
// 阻塞当前线程,直到闭锁减少到0,打开锁
countDownLatch.await();
ta.append("导入主账号信息成功\n");
ta.append("本次一共向uum_user表中写入"+uumUsers.size()+"条信息\n");
相关文章推荐
- 用CountDownLatch实现主线程等待子线程
- 用CountDownLatch实现主线程等待子线程
- 用CountDownLatch实现主线程等待子线程
- 用CountDownLatch实现主线程等待子线程
- 用CountDownLatch实现主线程等待子线程
- 采用Thread.join()或CountDownLatch来实现线程间同步
- 用CountDownLatch实现主线程等待子线程
- Java并发编程之CountDownLatch,CyclicBarrier实现一组线程相互等待、唤醒
- 进阶篇:等待多个子线程完毕再执行主线程的方法之CountDownLatch(十二)
- Java多线程之~~~使用CountDownLatch来同步多个线程实现一个任务
- 用CountDownLatch实现主线程等待子线程
- 用 join 或 CountDownLatch 让主线程等待所有子线程完成。
- 【CountDownLatch】实现多个线程同时启动
- Java 并发编程中的 CountDownLatch 锁用于多个线程同时开始运行或主线程等待子线程结束
- 黑马程序员-Condition条件对象、Semaphore、CyclicBarrier、倒计时门栓 CountDownLatch、Exchanger(实现两个线程之间数据交换
- 利用主线程与子线程间的消息通讯,实现任务处理队列
- Java:多线程等待所有线程结束(CountDownLatch/CyclicBarrier) .
- Java 通过主线程实现子线程的超时控制
- Java:多线程等待所有线程结束(CountDownLatch/CyclicBarrier)
- Java:多线程等待所有线程结束(CountDownLatch/CyclicBarrier) .