/* 单个信号量的Semaphonre对象可以实现互斥锁的功能, 并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁” 这可应用于死锁恢复的一些场合。 */ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; public class SemaphoreTest { public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool(); final Semaphore sp = new Semaphore(3); //只允许3个线程, for(int i=0;i<10;i++){ //10个任务 Runnable runnable = new Runnable(){ public void run(){ try{ sp.acquire(); //阻塞 } catch (InterruptedException e1) { e1.printStackTrace(); } System.out.println("线程" + Thread.currentThread().getName() + "进入,当前已有" + (3-sp.availablePermits()) + "个并发"); try{ Thread.sleep((long)(Math.random()*10000)); }catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程" + Thread.currentThread().getName() + "即将离开"); sp.release(); //释放 //下面代码有时候执行不准确,因为其没有和上面的代码合成原子单元 System.out.println("线程" + Thread.currentThread().getName() + "已离开,当前已有" + (3-sp.availablePermits()) + "个并发"); } }; service.execute(runnable); } } }
多线程并发Semaphore应用
猜你喜欢
转载自houston123.iteye.com/blog/2316582
今日推荐
周排行