首页 > 编程语言 >第二季:6CountDownLatch/CyclicBarrier/Semaphore使用过吗?【Java面试题】

第二季:6CountDownLatch/CyclicBarrier/Semaphore使用过吗?【Java面试题】

时间:2022-10-16 22:38:56浏览次数:49  
标签:面试题 Java Thread System public Semaphore println 车位 out


第二季:6CountDownLatch/CyclicBarrier/Semaphore使用过吗?【Java面试题】

前言


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 *********班长最后关门走人");

}
}

结果

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秒后离开车位

最后


2022 10/9 22:51


p32~p34


Markdown 4701 字数 332 行数
HTML 4469 字数 207 段落



标签:面试题,Java,Thread,System,public,Semaphore,println,车位,out
From: https://blog.51cto.com/u_15719556/5760725

相关文章