java通过semaphore信号灯实例,开启多个线程,但只并发3个线程。
Java代码 收藏代码
package com.mhm.test1;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
/**
* semaphore 信号灯
* 20个线程,开启3个信号灯,一个线程拿走一个灯,也就是说,同时只能有3个线程并发
* 一盏灯类似互斥sync
* @author Administrator
*
*/
public class SemaphoreTest {
public static void main(String[] args) {
ExecutorService es = Executors.newCachedThreadPool();
final Semaphore sp = new Semaphore(3);
for (int i = 0; i < 20; i++) {
Runnable r = new Runnable() {
@Override
public void run() {
try {
sp.acquire();
System.out.println(“进入” + Thread.currentThread().getName() + ” 当前有” + (3 – sp.availablePermits()) + “线程并行”);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
Thread.sleep((long)Math.random() * 10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(“【即将离开】” + Thread.currentThread().getName() + ” 当前有” + (3 – sp.availablePermits()) + “线程并行”);
sp.release();
System.out.println(“【离开】” + Thread.currentThread().getName() + ” 当前有” + (3 – sp.availablePermits()) + “线程并行”);
}
};
es.execute(r);
}
es.shutdown();
}
}