Semaphore用法疑惑
Semaphore可以控同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释许可。
下面通过一个例子来看一下Semaphore的具体使用:
假若一个工厂有3台机器,但是有8个工人,一台机器同时只能被一个工人使用,只有使用完了,其他工人才能继续使用。那么我们就可以通过Semaphore来实现:
package thread_connect;
import java.util.concurrent.Semaphore;
public class SemaphoreDemo {
static class Machine implements Runnable{
private int num;
private Semaphore semaphore;
public Machine(int num, Semaphore semaphore) {
this.num = num;
this.semaphore = semaphore;
}
public void run() {
try {
semaphore.acquire();//请求机器
System.out.println("工人"+this.num+"请求机器,正在使用机器");
Thread.sleep(1000);
System.out.println("工人"+this.num+"使用完毕,已经释放机器");
semaphore.release();//释放机器
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args){
int worker = 5;//工人数
Semaphore semaphore = new Semaphore(3);//机器数
for (int i=0; i< worker; i++){
new Thread(new Machine(i, semaphore)).start();
}
}
}
输出结果:
工人1请求机器,正在使用机器
工人2请求机器,正在使用机器
工人0请求机器,正在使用机器
工人0使用完毕,已经释放机器
工人1使用完毕,已经释放机器
工人2使用完毕,已经释放机器
工人3请求机器,正在使用机器
工人5请求机器,正在使用机器
工人4请求机器,正在使用机器
工人5使用完毕,已经释放机器
工人3使用完毕,已经释放机器
工人4使用完毕,已经释放机器
工人7请求机器,正在使用机器
工人6请求机器,正在使用机器
工人6使用完毕,已经释放机器
工人7使用完毕,已经释放机器
但是我存在一个疑问,望大家解答一下
把 System.out.println(“工人”+this.num+“使用完毕,已经释放机器”);放在方法semaphore.release();//释放机器。后面,输出结果如下
package thread_connect;
import java.util.concurrent.Semaphore;
public class SemaphoreDemo {
static class Machine implements Runnable{
private int num;
private Semaphore semaphore;
public Machine(int num, Semaphore semaphore) {
this.num = num;
this.semaphore = semaphore;
}
public void run() {
try {
semaphore.acquire();//请求机器
System.out.println("工人"+this.num+"请求机器,正在使用机器");
Thread.sleep(1000);
semaphore.release();//释放机器
System.out.println("工人"+this.num+"使用完毕,已经释放机器");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args){
int worker = 5;//工人数
Semaphore semaphore = new Semaphore(3);//机器数
for (int i=0; i< worker; i++){
new Thread(new Machine(i, semaphore)).start();
}
}
}
工人1请求机器,正在使用机器
工人0请求机器,正在使用机器
工人2请求机器,正在使用机器
工人0使用完毕,已经释放机器
工人4请求机器,正在使用机器
工人3请求机器,正在使用机器
工人2使用完毕,已经释放机器
工人1使用完毕,已经释放机器
工人5请求机器,正在使用机器
工人4使用完毕,已经释放机器
工人7请求机器,正在使用机器
工人6请求机器,正在使用机器
工人5使用完毕,已经释放机器
工人3使用完毕,已经释放机器
工人7使用完毕,已经释放机器
工人6使用完毕,已经释放机器
**查看前5行输出结果:**为什么工人0释放一个机器后,按理说只有一个线程能抢占呀,为什么后续有两个工人(4和 3工人)正在使用机器?