首页 > java > CountDownLatch线程递减锁示例
2015
08-14

CountDownLatch线程递减锁示例

线程递减锁适用领域:某些任务需要在一些前置任务都完成的情况下才能开启,这里的所有任务都是线程,那么我们就可以在前置任务里设置线程递减锁,已确保前置任务完毕之后才能开启后续任务。
以下示例中包含两个类,一个为项目经理,一个为员工,项目经理给员工安排任务,大家来完成任务,具体细节在代码注释中体现!

import java.util.Random;
import java.util.concurrent.CountDownLatch;
/**
 * 员工类
 * 
 * @author 小马哥
 * 
 */
public class Worker extends Thread {
	// 员工名
	String name;
	// 任务名称
	String taskName;
	// 线程递减锁
	CountDownLatch latch;

	public Worker(String name, String taskName, CountDownLatch latch) {
		this.name = name;
		this.taskName = taskName;
		this.latch = latch;
	}

	public void run() {
		try {
			// 随机模拟一个1-10的随机数,用来模拟表示完成任务所需要的时间
			int x = new Random().nextInt(10) + 1;
			Thread.sleep(x * 1000);
			System.out.println(name + "已经整理完了" + taskName + ",共花费" + x + "秒~");
			latch.countDown();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
import java.util.concurrent.CountDownLatch;
/**
 * 项目经理
 * @author 小马哥
 *
 */
public class Manager{
	
	public static void main(String[] args) {
		// 创建线程递减锁
		// 此递减锁构造时有个int类型的参数,即递减锁因子,一般为前置任务的个数
		// 在开启所有前置任务之后的地方使用其await()方法阻塞后续任务的执行,
		// 在每个前置任务完成的时候使用其countDown()方法,将递减锁因子减一,当递减锁递减到0时,阻塞失效,继续执行后续任务
		CountDownLatch latch = new CountDownLatch(3);

		// 模拟团队中一共有三个员工
		// 现在模拟项目经理正在分配任务,大家都来整理Excel中共1500行数据中的客户的电话号码
		System.out.println("项目经理给大家分配任务:\n小王负责Excel中的1-500行\n小李负责Excel中的501-1000行\n小张负责Excel中的1001-1500行\n");
		Worker 小王 = new Worker("小王", "Excel中的1-500行", latch);
		Worker 小李 = new Worker("小李", "Excel中的501-1000行", latch);
		Worker 小张 = new Worker("小张", "Excel中的1001-1500行", latch);

		// 让三个员工开始干活
		System.out.println("大家一起开始整理Excel中的数据:");
		小王.start();
		小李.start();
		小张.start();

		// 这里控制是否使用线程递减锁,可通过注释这块儿代码来检验使用线程递减锁和不使用线程递减锁的区别
		try {
			latch.await();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		// 等大家的任务都完成了(线程递减锁的阻塞失效了,即所有员工的任务都完成了)就告诉boss,工作完成了
		System.out.println("\n项目经理说:老板,所有工作都已经做完了,给大家放个假吧~~");
	}
}

最后编辑:
作者:小马哥
大数据技术学习及实践者~

留下一个回复

你的email不会被公开。