线程工具Semaphore
【摘要】 Semaphore信号灯,也是实现多线程间互斥的。多个线程只有拿到了这盏灯,才能执行下面的代码,相当于lock、sychronized; 当一个线程拿到了这盏灯后,其它线程将暂停等待,直到这个线程执行完毕释放灯。当然信号灯可以有多盏灯,如有3盏灯,然后10个线程去执行代码,这期间只能有3个线程拿到灯,可以执行。当有线程释放了1个灯后,其它7个线程当中才能有一个线程冲过去抢到灯...
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,表示公平,先来后到。
文章来源: blog.csdn.net,作者:冉航--小虾米,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/gaoxiaoweiandy/article/details/116856627
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)