新Java线程Semaphore:并行环境下访问竞争资源控制

新Java线程Semaphore:并行环境下访问竞争资源控制

Semaphore是从Java 1.5引入的Java线程新内容。Semaphore实现在线程的竞争资源访问环境下,对资源的访问控制。只有申请(acquire)得到Semaphore的许可证的线程任务可以访问竞争资源。
例如:

    private void test() {
        // 虽然有很多线程想访问某些资源,但只发布一个许可证。
        // 只允许一个线程获取许可运行。
        int permits = 1;

        Semaphore semaphore = new Semaphore(permits);
        for (int i = 0; i < 5; i++) {
            new WorkThread(i, semaphore).start();
        }
    }

    private class WorkThread extends Thread {
        private int seq;
        private Semaphore semaphore;

        public WorkThread(int seq, Semaphore semaphore) {
            this.seq = seq;
            this.semaphore = semaphore;
        }

        @Override
        public void run() {
            try {
                // 阻塞的获取并发环境下的运行许可。
                semaphore.acquire();

                // 获取了并发环境下的运行许可。
                System.out.println("线程" + this.seq + "开始运行...");
                Thread.sleep(3000);
                System.out.println("线程" + this.seq + "运行结束");

                // 务必释放许可给其他并发任务。
                semaphore.release();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

代码输出:

2018-10-26 09:49:43.734 3277-3326/zhangphil.test I/System.out: 线程2开始运行...
2018-10-26 09:49:46.735 3277-3326/zhangphil.test I/System.out: 线程2运行结束
2018-10-26 09:49:46.736 3277-3323/zhangphil.test I/System.out: 线程1开始运行...
2018-10-26 09:49:49.737 3277-3323/zhangphil.test I/System.out: 线程1运行结束
2018-10-26 09:49:49.739 3277-3322/zhangphil.test I/System.out: 线程0开始运行...
2018-10-26 09:49:52.739 3277-3322/zhangphil.test I/System.out: 线程0运行结束
2018-10-26 09:49:52.741 3277-3329/zhangphil.test I/System.out: 线程4开始运行...
2018-10-26 09:49:55.742 3277-3329/zhangphil.test I/System.out: 线程4运行结束
2018-10-26 09:49:55.743 3277-3327/zhangphil.test I/System.out: 线程3开始运行...
2018-10-26 09:49:58.743 3277-3327/zhangphil.test I/System.out: 线程3运行结束

Semaphore的acquire将尝试以阻塞式的方式获取访问资源许可(在本例中是在多线程环境下申请让当前线程执行),但是在本例中,Semaphore颁发的许可为1(int permits=1 ),那么虽然有很多线程(本例是在test函数的for循环中创建5个打算同时并发执行的线程)想获得(acquire)Semaphore的许可证得以运行,但必须进行等待,等待其他提前获得(acquire)Semaphore许可证的线程释放掉(release)仅有的1个许可证后才得以放行运行执行。

你可能感兴趣的:(Java,Java多线程,线程,Java)