您的位置:首页 > 其它

用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");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: