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

it2024-05-06  60

概念

https://blog.csdn.net/qq_41489540/article/details/109198601

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()归还许可证
最新回复(0)