概念 Demo1 演示的时候 可以在private static Semaphore s = new Semaphore(10); 代码的构造里面输入指定数字,这个数字的是指定多少个线程并发执行的 import utils . SleepTools ; import java . util . concur
概念
Demo1
演示的时候 可以在private static Semaphore s = new Semaphore(10); 代码的构造里面输入指定数字,这个数字的是指定多少个线程并发执行的
import utils.SleepTools;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
/**
* 在代码中,虽然有30个线程在执行,但是只允许10个并发执行。Semaphore的构造方法
* Semaphore(int permits)接受一个整型的数字,表示可用的许可证数量。Semaphore(10)表示允
* 许10个线程获取许可证,也就是最大并发数是10。Semaphore的用法也很简单,首先线程使用
* Semaphore的acquire()方法获取一个许可证,使用完之后调用release()方法归还许可证。还可以
* 用tryAcquire()方法尝试获取许可证。
*/
public class Demo1 {
private static final int THREAD_COUNT = 30; //线程数量
private static ExecutorService threadPool = Executors.newFixedThreadPool(THREAD_COUNT);
// private static Semaphore s = new Semaphore(1); //表示最大并发数是1
private static Semaphore s = new Semaphore(10); //表示最大并发数是10
public static void main(String[] args) {
for (int i = 0; i < THREAD_COUNT; i++) {
final int threadnum = i;
threadPool.execute(new Runnable() {
public void run() {
try {
this.doWork(); // 开始工作
} catch (InterruptedException e) {
}
}
private void doWork() throws InterruptedException {
s.acquire(); // 获取凭证
System.out.println("threadnum" + threadnum + "调用了s.acquire()获取凭证");
SleepTools.second(2);// 为了模拟执行业务代码,我这里睡眠2秒
System.out.println("我执行完了业务代码........");
s.release(); // 归还凭证
System.out.println("---------------------threadnum" + threadnum + "调用了s.release()归还许可证");
}
});
}
threadPool.shutdown();
}
}
控制台打印
10个线程并发运行
可以看控制台打印,然后感受一下, 很快任务就运行完了
控制台打印:
threadnum4调用了s.acquire()获取凭证
threadnum3调用了s.acquire()获取凭证
threadnum0调用了s.acquire()获取凭证
threadnum2调用了s.acquire()获取凭证
threadnum7调用了s.acquire()获取凭证
threadnum6调用了s.acquire()获取凭证
threadnum5调用了s.acquire()获取凭证
threadnum8调用了s.acquire()获取凭证
threadnum10调用了s.acquire()获取凭证
我执行完了业务代码........
我执行完了业务代码........
我执行完了业务代码........
我执行完了业务代码........
我执行完了业务代码........
我执行完了业务代码........
我执行完了业务代码........
我执行完了业务代码........
我执行完了业务代码........
我执行完了业务代码........
threadnum19调用了s.acquire()获取凭证
---------------------threadnum4调用了s.release()归还许可证
threadnum17调用了s.acquire()获取凭证
threadnum16调用了s.acquire()获取凭证
---------------------threadnum10调用了s.release()归还许可证
---------------------threadnum1调用了s.release()归还许可证
threadnum15调用了s.acquire()获取凭证
---------------------threadnum0调用了s.release()归还许可证
threadnum18调用了s.acquire()获取凭证
threadnum13调用了s.acquire()获取凭证
---------------------threadnum6调用了s.release()归还许可证
---------------------threadnum8调用了s.release()归还许可证
threadnum12调用了s.acquire()获取凭证
---------------------threadnum2调用了s.release()归还许可证
threadnum9调用了s.acquire()获取凭证
threadnum11调用了s.acquire()获取凭证
---------------------threadnum7调用了s.release()归还许可证
---------------------threadnum3调用了s.release()归还许可证
threadnum14调用了s.acquire()获取凭证
---------------------threadnum5调用了s.release()归还许可证
我执行完了业务代码........
我执行完了业务代码........
我执行完了业务代码........
threadnum21调用了s.acquire()获取凭证
我执行完了业务代码........
我执行完了业务代码........
我执行完了业务代码........
threadnum23调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum14调用了s.release()归还许可证
我执行完了业务代码........
我执行完了业务代码........
threadnum28调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum15调用了s.release()归还许可证
---------------------threadnum16调用了s.release()归还许可证
threadnum29调用了s.acquire()获取凭证
threadnum27调用了s.acquire()获取凭证
threadnum22调用了s.acquire()获取凭证
---------------------threadnum12调用了s.release()归还许可证
threadnum25调用了s.acquire()获取凭证
threadnum24调用了s.acquire()获取凭证
---------------------threadnum13调用了s.release()归还许可证
---------------------threadnum9调用了s.release()归还许可证
---------------------threadnum17调用了s.release()归还许可证
threadnum26调用了s.acquire()获取凭证
---------------------threadnum18调用了s.release()归还许可证
threadnum20调用了s.acquire()获取凭证
---------------------threadnum19调用了s.release()归还许可证
---------------------threadnum11调用了s.release()归还许可证
我执行完了业务代码........
我执行完了业务代码........
---------------------threadnum28调用了s.release()归还许可证
我执行完了业务代码........
---------------------threadnum22调用了s.release()归还许可证
我执行完了业务代码........
---------------------threadnum29调用了s.release()归还许可证
我执行完了业务代码........
---------------------threadnum27调用了s.release()归还许可证
我执行完了业务代码........
---------------------threadnum23调用了s.release()归还许可证
我执行完了业务代码........
---------------------threadnum21调用了s.release()归还许可证
我执行完了业务代码........
---------------------threadnum20调用了s.release()归还许可证
我执行完了业务代码........
---------------------threadnum26调用了s.release()归还许可证
我执行完了业务代码........
---------------------threadnum24调用了s.release()归还许可证
---------------------threadnum25调用了s.release()归还许可证
1个线程并发运行
一个线程并发运行,基本就是串行化执行,
运行任务很慢,和10个线程并发运行那差距不是一点点了.
控制台输入:
threadnum0调用了s.acquire()获取凭证我执行完了业务代码........
---------------------threadnum0调用了s.release()归还许可证
threadnum1调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum1调用了s.release()归还许可证
threadnum2调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum2调用了s.release()归还许可证
threadnum3调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum3调用了s.release()归还许可证
threadnum4调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum4调用了s.release()归还许可证
threadnum5调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum5调用了s.release()归还许可证
threadnum6调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum6调用了s.release()归还许可证
threadnum7调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum7调用了s.release()归还许可证
threadnum8调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum8调用了s.release()归还许可证
threadnum9调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum9调用了s.release()归还许可证
threadnum10调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum10调用了s.release()归还许可证
threadnum11调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum11调用了s.release()归还许可证
threadnum12调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum12调用了s.release()归还许可证
threadnum13调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum13调用了s.release()归还许可证
threadnum14调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum14调用了s.release()归还许可证
threadnum15调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum15调用了s.release()归还许可证
threadnum16调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum16调用了s.release()归还许可证
threadnum17调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum17调用了s.release()归还许可证
threadnum18调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum18调用了s.release()归还许可证
threadnum19调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum19调用了s.release()归还许可证
threadnum20调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum20调用了s.release()归还许可证
threadnum22调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum22调用了s.release()归还许可证
threadnum21调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum21调用了s.release()归还许可证
threadnum23调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum23调用了s.release()归还许可证
threadnum24调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum24调用了s.release()归还许可证
threadnum25调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum25调用了s.release()归还许可证
threadnum26调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum26调用了s.release()归还许可证
threadnum27调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum27调用了s.release()归还许可证
threadnum28调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum28调用了s.release()归还许可证
threadnum29调用了s.acquire()获取凭证
我执行完了业务代码........
---------------------threadnum29调用了s.release()归还许可证