用CountDownLatch实现主线程等待子线程

多线程中,主线程先等待,等待其他子线程运行结束才执行。

如果不加限制,主线程和子线程是并发执行的,主线程并没有等待。若果碰到求“总的所有线程运行时间”,“线程运行结束才进行显示的语句”等业务要求,则不能满足。

3.1对于只有一个子线程,如果主线程需要等待子线程执行完成,再继续向下执行,可以使用Threadjoin()方法。

3.2)对于多个子线程,比如主线程需要等待5个子线程5个线程之间是并发执行。

要想子线程之间能并发执行,那么需要在所有子线程start(),在执行所有子线程的join()方法

3.3CountDownLatch实现

CountDownLatchjava.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");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值