线程工具Semaphore

发布于:2021-09-18 19:14:00

Semaphore信号灯,也是实现多线程间互斥的。多个线程只有拿到了这盏灯,才能执行下面的代码,相当于lock、sychronized; 当一个线程拿到了这盏灯后,其它线程将暂停等待,直到这个线程执行完毕释放灯。当然信号灯可以有多盏灯,如有3盏灯,然后10个线程去执行代码,这期间只能有3个线程拿到灯,可以执行。当有线程释放了1个灯后,其它7个线程当中才能有一个线程冲过去抢到灯。


示例代码如下:


package cn.itcast.heima2;


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;


public class SemaphoreTest {
?? ?public static void main(String[] args) {
?? ??? ?ExecutorService service = Executors.newCachedThreadPool();
?? ??? ?final ?Semaphore sp = new Semaphore(3);
?? ??? ?for(int i=0;i<10;i++){
?? ??? ??? ?Runnable runnable = new Runnable(){
?? ??? ??? ??? ??? ?public void run(){
?? ??? ??? ??? ??? ?try {
?? ??? ??? ??? ??? ??? ?sp.acquire();
?? ??? ??? ??? ??? ?} catch (InterruptedException e1) {
?? ??? ??? ??? ??? ??? ?e1.printStackTrace();
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?System.out.println("线程" + Thread.currentThread().getName() +?
?? ??? ??? ??? ??? ??? ??? ?"进入,当前已有" + (3-sp.availablePermits()) + "个并发");
?? ??? ??? ??? ??? ?try {
?? ??? ??? ??? ??? ??? ?Thread.sleep((long)(Math.random()*10000));
?? ??? ??? ??? ??? ?} catch (InterruptedException e) {
?? ??? ??? ??? ??? ??? ?e.printStackTrace();
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?System.out.println("线程" + Thread.currentThread().getName() +?
?? ??? ??? ??? ??? ??? ??? ?"即将离开");?? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ?sp.release();
?? ??? ??? ??? ??? ?//下面代码有时候执行不准确,因为其没有和上面的代码合成原子单元
?? ??? ??? ??? ??? ?System.out.println("线程" + Thread.currentThread().getName() +?
?? ??? ??? ??? ??? ??? ??? ?"已离开,当前已有" + (3-sp.availablePermits()) + "个并发");?? ??? ??? ??? ??? ?
?? ??? ??? ??? ?}
?? ??? ??? ?};
?? ??? ??? ?service.execute(runnable);?? ??? ??? ?
?? ??? ?}
?? ?}


}
?


其中代码 ?Semaphore sp = new Semaphore(3);表示有3盏灯。


那么有人要问了,如果现在有1个空闲灯,那么其它7个线程谁能抢到这盏灯呢? 有两种情况:


1. 谁跑的快,力气大谁抢到。就像上面那样。


2. 先来后到,谁先来谁优先分配到这盏灯。


?Semaphore sp = new Semaphore(3,true),多了个参数true,表示公*,先来后到。

相关推荐

最新更新

猜你喜欢