Java并发——Semaphore信号量

2017-10-27  本文已影响80人  耳_总

Semephore类是java.util.concurrent包下处理并发的工具类,Semephore能够控制任务访问资源的数量,如果资源不够,则任务阻塞,等待其他资源的释放。
比如一个停车场有三个车位,当车位空余数量小于3时,车辆可以进入停车场停车。如果停车场已经没有了空余车位,后面来的车就不能进入停车场,只能在停车场外等待,等其他车辆离开之后才能进入。

Semephore类的主要方法
public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(3);
        ExecutorService exec = Executors.newCachedThreadPool();
        for (int i = 0; i < 10; i++) {
            exec.execute(new Task(semaphore));
        }
//      semaphore.acquireUninterruptibly(3);
        exec.shutdown();
    }
    
    public static class Task implements Runnable {

        private Semaphore semaphore;

        public Task(Semaphore semaphore) {
            this.semaphore = semaphore;
        }
        
        @Override
        public void run() {
            try {
                semaphore.acquire();
                System.out.println(Thread.currentThread().getName() + "获取了资源");
                TimeUnit.SECONDS.sleep(1);
                System.out.println(Thread.currentThread().getName() + "准备释放资源");
                semaphore.release();
                System.out.println(Thread.currentThread().getName() + "释放了资源");
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
    }

输出:
pool-1-thread-1获取了资源
pool-1-thread-2获取了资源
pool-1-thread-3获取了资源
pool-1-thread-3准备释放资源
pool-1-thread-1准备释放资源
pool-1-thread-1释放了资源
pool-1-thread-3释放了资源
pool-1-thread-2准备释放资源
pool-1-thread-2释放了资源
pool-1-thread-5获取了资源
pool-1-thread-4获取了资源
pool-1-thread-6获取了资源
pool-1-thread-6准备释放资源
pool-1-thread-5准备释放资源
pool-1-thread-4准备释放资源
pool-1-thread-4释放了资源
pool-1-thread-7获取了资源
pool-1-thread-5释放了资源
pool-1-thread-8获取了资源
pool-1-thread-6释放了资源
pool-1-thread-9获取了资源
pool-1-thread-8准备释放资源
pool-1-thread-7准备释放资源
pool-1-thread-10获取了资源
pool-1-thread-9准备释放资源
pool-1-thread-9释放了资源
pool-1-thread-7释放了资源
pool-1-thread-8释放了资源
pool-1-thread-10准备释放资源
pool-1-thread-10释放了资源

上一篇下一篇

猜你喜欢

热点阅读