线程-CountDownLatch的使用

CountDownLatch的使用

遇到此问题的环境:我需要从数据库中取出5000条数据,循环数据,对每条数据每个字段进行分析处理,这里每个字段都会创建新的线程去处理,并写库;只有当每个线程执行完,才能进行下一次的循环。

CountDownLatch

  • countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。
  • 是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了。
private ExecutorService pool = null;
private static int zdNum = 16;// 字段数
public void run() {
	// 创建线程池
	pool = Executors.newFixedThreadPool(zdNum);
	// 定义计数器
	final CountDownLatch latch = new CountDownLatch(zdNum);
	// 获取5000条数据
	List list = getData();
	for(int i=1;i<=list.size();i++){
		final int j = i;	// 多线程中for循环变量需要拿出来定义
		pool.execute(new Runnable() {
			@Override
			public void run() {
				try{
					switch(j) {
					case 1:
					case 2:
					...
					//分需求处理
					}
				}catch (Exception e) {
					e.printStackTrace();
				} finally {
					latch.countDown();// 每个线程执行完,计数器-1 如果>0则会执行await方法阻塞线程。
				}
			}
		});
	}
	latch.await();//阻塞当前线程,直到计数器的值为0 ,所以会等这次循环走完才会执行下一次循环。
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章