Semaphore简介
-
Semaphore是一个计数信号量,它的本质是一个"共享锁"。
-
信号量维护了一个信号量许可集。线程可以通过调用acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可。
public class MyRunnable implements Runnable{ private Semaphore semaphore; private int user; public MyRunnable(Semaphore semaphore, int user) { this.semaphore = semaphore; this.user = user; } public MyRunnable() { } @Override public void run() { try { semaphore.acquire(); System.out.println("用户"+user+"进入窗口"); Thread.sleep((long)Math.random()*10000); System.out.println("用户"+user+"买票完成,即将离开"); Thread.sleep((long)Math.random()*10000); System.out.println("用户"+user+"已经离开"); semaphore.release(); } catch (InterruptedException e) { e.printStackTrace(); } } } -
public class Demo { public static void main(String[] args) { executeTask(); } public static void executeTask(){ final Semaphore s = new Semaphore(2); ExecutorService threadPool = Executors.newCachedThreadPool(); for (int i = 0; i <20 ; i++) { threadPool.execute(new MyRunnable(s,i+1)); } threadPool.shutdown(); } } -
信号量当做实现了Runnable接口自类的参数
-
主要的两个方法acquire() 和 release()。
-
和线程池搭配,控制每次执行线程的个数。(控制了多线程并发的数量)
本文深入解析Semaphore信号量的概念,它是实现线程同步的一种重要机制,通过控制许可数量达到限制线程并发的目的。文章通过示例代码展示如何使用Semaphore来管理线程的执行,特别强调其与线程池结合使用时的优势。
1264

被折叠的 条评论
为什么被折叠?



