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()。
-
和线程池搭配,控制每次执行线程的个数。(控制了多线程并发的数量)