前言
2022 10/9 20:28
路漫漫其修远兮,吾将上下而求索
本文是根据尚硅谷学习所做笔记
仅供学习交流使用,转载注明出处
推荐
6CountDownLatch/CyclicBarrier/Semaphore使用过吗?
说明
本文目录前是相关视频的名字和具体视频中思维导图的名字
题目
6CountDownLatch/CyclicBarrier/Semaphore使用过吗?
32 CountDownLatch
CountDownLatch
秦灭六国,一统华夏
让一些线程阻塞直到另一些线程完成一系列操作后才被唤醒
CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,调用线程会被阻塞。其它线程调用countDown方法会将计数器减1调用countDown方法的线程不会阻塞),当计数器的值变为零时,因调用await方法被阻塞的线程会被唤醒,继续执行。
CountDownLatchDemo
package ccs6; public class CountDownLatchDemo { public static void main(String[] args) { //forthread10 for (int i = 1; i <= 6; i++) { new Thread(()->{ System.out.println(Thread.currentThread().getName()+"\t上完自习,离开教室"); },String.valueOf(i)).start(); } System.out.println(Thread.currentThread().getName()+"\t *********班长最后关门走人"); } }
结果
1 上完自习,离开教室 4 上完自习,离开教室 3 上完自习,离开教室 main *********班长最后关门走人 2 上完自习,离开教室 6 上完自习,离开教室 5 上完自习,离开教室
package ccs6; import java.util.concurrent.CountDownLatch; public class CountDownLatchDemo { public static void main(String[] args) throws Exception { CountDownLatch countDownLatch =new CountDownLatch(6); //forthread10 for (int i = 1; i <= 6; i++) { new Thread(()->{ System.out.println(Thread.currentThread().getName()+"\t上完自习,离开教室"); countDownLatch.countDown(); },String.valueOf(i)).start(); } countDownLatch.await(); System.out.println(Thread.currentThread().getName()+"\t *********班长最后关门走人"); } }
package ccs6; import java.util.concurrent.CountDownLatch; public class CountDownLatchDemo { //秦灭六国,一统华夏 public static void main(String[] args) throws Exception { CountDownLatch countDownLatch =new CountDownLatch(6); //forthread10 for (int i = 1; i <= 6; i++) { new Thread(()->{ System.out.println(Thread.currentThread().getName()+"国,被灭"); countDownLatch.countDown(); },CountryEnum.foreach_CountryEnum(i).getRetMessage()).start(); } countDownLatch.await(); System.out.println(Thread.currentThread().getName()+"\t *********秦国,一统华夏"); System.out.println(); System.out.println(CountryEnum.ONE);//ONE System.out.println(CountryEnum.ONE.getRetCode());//1 System.out.println(CountryEnum.ONE.getRetMessage());//齐 } public static void closeDoor() throws Exception { //... } }
楚国,被灭 燕国,被灭 齐国,被灭 赵国,被灭 魏国,被灭 韩国,被灭 main *********秦国,一统华夏
33 CyclicBarrierDemo
CyclicBarrier
男生版:集齐龙珠,召唤神龙
女生版:打麻将,三缺一
package ccs6; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class CyclicBarrierDemo { public static void main(String[] args) { //CyclicBarrier(int parties, Runnable barrierAction) CyclicBarrier cyclicBarrier=new CyclicBarrier(7,()->{ System.out.println("****召唤神龙****"); }); //forthread10 for (int i = 1; i <= 7; i++) { final int tempInt=i; new Thread(()->{ System.out.println(Thread.currentThread().getName()+"\t 收集到第:"+tempInt+"龙珠"); try { cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } },String.valueOf(i)).start(); } } }
2 收集到第:2龙珠 4 收集到第:4龙珠 5 收集到第:5龙珠 3 收集到第:3龙珠 1 收集到第:1龙珠 6 收集到第:6龙珠 7 收集到第:7龙珠 ****召唤神龙****
34 SemaphoreDemo
Semaphore
争车位
信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。
SemaphoreDemo
争车位
代码
package ccs6; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; public class SemaphoreDemo { public static void main(String[] args) { Semaphore semaphore=new Semaphore(3);//模拟3个停车位 for (int i = 1; i <= 6; i++) {//模拟6个车 new Thread(()->{ try { semaphore.acquire(); System.out.println(Thread.currentThread().getName()+"\t抢到车位"); try{ TimeUnit.SECONDS.sleep(3); }catch (InterruptedException e){ e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"\t停车3秒后离开车位"); } catch (InterruptedException e) { e.printStackTrace(); } finally { semaphore.release(); } },String.valueOf(i)).start(); } } }
3 抢到车位 1 抢到车位 2 抢到车位 3 停车3秒后离开车位 1 停车3秒后离开车位 2 停车3秒后离开车位 4 抢到车位 6 抢到车位 5 抢到车位 4 停车3秒后离开车位 5 停车3秒后离开车位 6 停车3秒后离开车位
最后
2022 10/9 22:51
p32~p34
Markdown 4701 字数 332 行数
HTML 4469 字数 207 段落