Semaphore(信号量):是用来控制同时访问特定资源的线程数量,它通过协调各个线程以保证合理的使用公共资源。
通俗的讲,在学校1000人,食堂位置100个,食堂的座位是公共资源,但是有限,不能容纳所有学生同一时间吃饭,同一时间只能有100个学生坐在那里吃饭,信号量起到限流的作用。
废话不多说,直接代码:
package java中的并发工具类;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class Samephore {
private static final int thread_count = 30;
private static ExecutorService threadPool = Executors.newFixedThreadPool(thread_count);
private static Semaphore s = new Semaphore(3);
public static void main(String[] args) {
for (int i = 0; i < thread_count; i++) {
int icopy = i;
threadPool.execute(new Runnable() {
@Override
public void run() {
try {
s.acquire();
System.out.println("第"+icopy+"线程开始运行。。。");
Thread.sleep(3000);
System.out.println("第"+icopy+"线程结束运行。。。");
s.release();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
threadPool.shutdown();
}
}
控制台:
第1线程开始运行。。。
第2线程开始运行。。。
第0线程开始运行。。。
第1线程结束运行。。。
第3线程开始运行。。。
第2线程结束运行。。。
第0线程结束运行。。。
第4线程开始运行。。。
第5线程开始运行。。。
第3线程结束运行。。。
第6线程开始运行。。。
第5线程结束运行。。。
第4线程结束运行。。。
第7线程开始运行。。。
第8线程开始运行。。。
第6线程结束运行。。。
第9线程开始运行。。。
第8线程结束运行。。。
第7线程结束运行。。。
第10线程开始运行。。。
第11线程开始运行。。。
第9线程结束运行。。。
第12线程开始运行。。。
第10线程结束运行。。。
第11线程结束运行。。。
第13线程开始运行。。。
第14线程开始运行。。。
第12线程结束运行。。。
第15线程开始运行。。。
第14线程结束运行。。。
第13线程结束运行。。。
第16线程开始运行。。。
第17线程开始运行。。。
第15线程结束运行。。。
第18线程开始运行。。。
第16线程结束运行。。。
第17线程结束运行。。。
第19线程开始运行。。。
第20线程开始运行。。。
第18线程结束运行。。。
第21线程开始运行。。。
第20线程结束运行。。。
第19线程结束运行。。。
第23线程开始运行。。。
第22线程开始运行。。。
第21线程结束运行。。。
第24线程开始运行。。。
第23线程结束运行。。。
第22线程结束运行。。。
第25线程开始运行。。。
第26线程开始运行。。。
第24线程结束运行。。。
第27线程开始运行。。。
第25线程结束运行。。。
第28线程开始运行。。。
第26线程结束运行。。。
第29线程开始运行。。。
第27线程结束运行。。。
第29线程结束运行。。。
第28线程结束运行。。。