package com.atguigu.bigdata.juc;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
/**
* @auth tianmin
* @date 2020-03-03 - 10:20
* @nodes 7个线程抢占3个车位,保证每个线程都能抢到一次
* 信号灯:
* acquire(获取):当一个线程调用acquire操作时,它要么通过成功获取信号量(信号量减1),要么一直等下去,
* 直到有线程释放信号量,或者超时。
* release(释放):实际会降信号量加1,然后唤醒等待的线程。
* 信号量主要用于两个目的:
* 1.用于多个共享资源的互斥使用
* 2.用于并发线程数的控制
* 执行结果:
0 获取到了车位
3 获取到了车位
1 获取到了车位
0 离开了车位
1 离开了车位
4 获取到了车位
3 离开了车位
2 获取到了车位
6 获取到了车位
2 离开了车位
4 离开了车位
6 离开了车位
5 获取到了车位
5 离开了车位
*/
public class SemaPhoreDemo {
public static void main(String[] args) {
//定义了3个车位
Semaphore semaphore = new Semaphore(3);
// 开启7个线程抢3个车位
for (int i = 0; i < 7; i++) {
new Thread(()->{
try {
//此线程在获取车位
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + "\t获取到了车位" );
// 停3秒在释放车位
TimeUnit.SECONDS.sleep(3);
System.out.println(Thread.currentThread().getName() + "\t离开了车位" );
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
// 释放资源
semaphore.release();
}
}, String.valueOf(i)).start();
}
}
}
信号灯:控制线程并发数
最新推荐文章于 2021-06-10 23:38:00 发布