当前位置 : 主页 > 编程语言 > java >

Java并发编程之Semaphore代码演示 *

来源:互联网 收集:自由互联 发布时间:2022-07-05
概念 ​ 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() {
@Override
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个线程并发运行

可以看控制台打印,然后感受一下, 很快任务就运行完了
控制台打印:

threadnum1调用了s.acquire()获取凭证
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()归还许可证


上一篇:Java并发编程之Semaphore概念 *
下一篇:没有了
网友评论