多线程中,主线程先等待,等待其他子线程运行结束才执行。
如果不加限制,主线程和子线程是并发执行的,主线程并没有等待。若果碰到求“总的所有线程运行时间”,“线程运行结束才进行显示的语句”等业务要求,则不能满足。
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");