java通过semaphore信号灯实例,开启多个线程,但只并发3个线程



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();
}
}