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 *********班长最后关门走人");
}
}
结果
1 上完自习,离开教室
3 上完自习,离开教室
2 上完自习,离开教室
6 上完自习,离开教室
5 上完自习,离开教室
4 上完自习,离开教室
main *********班长最后关门走人
package ccs6;
import lombok.Getter;
public enum CountryEnum {
ONE(1,"齐"),TWO(2,"楚"),THREE(3,"燕"),FOUR(4,"赵"),FIVE(5,"魏"),SIX(6,"韩");
@Getter private Integer retCode;
@Getter private String retMessage;
CountryEnum(Integer retCode, String retMessage) {
this.retCode = retCode;
this.retMessage = retMessage;
}
public static CountryEnum foreach_CountryEnum(int index){
CountryEnum[] myArray = CountryEnum.values();
for (CountryEnum element:myArray) {
if (index==element.getRetCode()){
return element;
}
}
return null;
}
}
/*
mysql dbName = countryEnum
table
one
ID userName age birth userEmail
1 齐 109
ONE(1,“齐"", v2,v3, v4 , v5)
*/
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秒后离开车位