Java并发工具Semaphore示例
下文笔者讲述Semaphore示例分享,如下所示
Semaphore简介
Semaphore类是并发工具包下的类 Semaphore类是线程之间互相发送信号的工具 Semaphore类可作为一个包含多个许可(permit)的集合 如: 一个代表6个许可Semaphore Semaphore上的acuqire操作申请P 而release操作则产生P Semaphore可用于追踪可用资源的个数例:Semaphore类使用示例
package com.java265; import java.util.concurrent.Semaphore; import java.util.stream.IntStream; public class TestSemaphore { private static Semaphore semaphore = new Semaphore(3);//设定初始值,可为负数(默认不公平策略) // private static Semaphore semaphore = new Semaphore(3, true);//可指定是否用公平FIFO策略 /** * @param args */ public static void main(String[] args) { IntStream.range(1,6).forEach(i -> testThread(i)); // semaphore.acquire();//有可用许可时获得许可,许可数-1,否则阻塞等待(中断会抛出InterruptedException) // semaphore.acquire(permits);//获得指定个数的许可(InterruptedException) // semaphore.acquireUninterruptibly();//如果被中断不会抛出异常,继续等待 // semaphore.acquireUninterruptibly(permits);//获得指定个数 // semaphore.availablePermits();//返回当前可用许可数 // semaphore.drainPermits();//返回当前可用许可,并将许可数置为0 // semaphore.getQueueLength();//等待线程队列长度 // semaphore.hasQueuedThreads();//是否有在等待的线程 // semaphore.isFair();//是否是公平的FIFO // semaphore.release();//释放许可,许可数+1(由程序约束释放量) // semaphore.release(permits);//释放多个许可 // semaphore.tryAcquire();//得到许可返回true,否则返回false,不阻塞,不按公平策略 // semaphore.tryAcquire(permits);//多个许可 // semaphore.tryAcquire(timeout, unit);//指定等待时间,时间内获得返回true,超时获得不到返回false(InterruptedException) // semaphore.tryAcquire(permits, timeout, unit);//指定等待时间和获得许可数(InterruptedException) } public static void testThread(final int i) { try { Thread.sleep(150); } catch (InterruptedException e1) { e1.printStackTrace(); } new Thread(() -> { try { System.out.println(i + " 准备获得许可"); semaphore.acquire(); System.out.println(i + "-得到许可。"); int available = semaphore.availablePermits(); System.out.println(i + " 当前剩余:" + available); System.out.println(i + " 是否有等待队列:" + semaphore.hasQueuedThreads()); System.out.println(i + " 等待队列长度:" + semaphore.getQueueLength()); Thread.sleep(1000); System.out.println(i + "-释放许可。"); semaphore.release(); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。