在java.util.concurrent包下有很多线程相关的类,其中CountDownLatch、CyclicBarrier、Semaphore算是比较常用的,其它的还有Phaser、Exchanger…等等。
只是几个工具类的简单使用,原理请大家自行搜索。
CountDownLatch
定义是允许一个或多个线程一直等待,直到其他线程完成他们的操作,其再继续执行。
常用API : await()、countDown();
举个例子(可能不太恰当):
麻将铺老板,现在他铺子里有4个人在打麻将,
CountDownLatch countDownLatch = new CountDownLatch(4);//4个人
然后老板想关门睡觉了,但是不行啊,得等着4个人都走了才可以,所以就等啊等…
countDownLatch.await();// 老板在这儿一直等
然后他们终于打完了,准备走了,但是走之前还得干点事儿.。
等4个人都走完了,老板终于可以关门睡觉了。
countDownLatch.await();
System.out.println("老板终于可以关门睡觉了");
这就是一个人(线程)等待多个人(线程)执行结束,然后这个人再开始执行。
再看一个 多个人(线程)等待一个人(线程)的例子:
4个人要打麻将,走到麻将馆结果老板刚起床,都得在门口等着老板开门。
CyclicBarrier
定义:允许一组线程互相等待,直到到达某个公共屏障点,CyclicBarrier注重的是:当线程到达某个状态后,暂停下来等待其他线程,所有线程均到达以后,继续执行。
主要API:await()
示例:
一群4个人去爬山,各自往上爬,约定先到第一站的在那儿等,等到所有人都到了第一站再各自继续往第二站出发,到了第二站还是在那儿等,等所有人都到了第二站再做后续的事情…
Semaphore
可以控制同时访问的线程个数,它维护了一组许可证。
主要API:acquire()、release()
例子:
某公司为了防止员工带薪拉si,所以对厕所进行了改造,最多只能同时供5人使用厕所,每次使用厕所需要提前在前台小姐姐哪儿领牌子,有牌子才能进厕所,否则填个上厕所申请然后就在工位上待着,上完厕所后要把牌子还给小姐姐,有空的牌子后,小姐姐会来叫你。