package cn.everest.thread;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class Thread20130319 {
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
final Semaphore semaphore = new Semaphore(3, true);
for (int i = 1; i <= 10; i++) {
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程" + Thread.currentThread().getName() +
"进入,当前已有" + (3-semaphore.availablePermits()) + "个并发");
try {
Thread.sleep((new Random().nextInt(10) + 1) * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
/*
* 关键点理解:
* 1、sleep几秒后,线程的运行权就不知道是谁的了,因为同时有三个有信号
* 2、当前sleep的线程确实没有释放执行资格,但是具备执行资格的线程同时有三个
*/
System.out.println("线程" + Thread.currentThread().getName() + "即将要退出");
semaphore.release();
System.out.println("线程" + Thread.currentThread().getName() +
"退出,当前已有" + (3-semaphore.availablePermits()) + "个并发");
} // run
};
/*
* 执行每一个命令
*/
executorService.execute(runnable);
}
}
}
semaphore研究
最新推荐文章于 2023-03-17 10:49:19 发布