java 多线程-信号量 Semaphore
2017-12-05 20:24
429 查看
public class Test{public static void main(String[] arg){Semaphore semaphore = new Semaphore(3);//定义信号量//SecurityManager sm = System.getSecurityManager();//ThreadGroup group = sm == null ? Thread.currentThread().getThreadGroup() : sm.getThreadGroup();ThreadGroup group = new ThreadGroup("semaphore");//自定义线程组AtomicInteger num = new AtomicInteger(0);ThreadPoolExecutor pool = new ThreadPoolExecutor(5,8,1000,TimeUnit.SECONDS,new LinkedBlockingDeque<Runnable>(20), new ThreadFactory() {//线程池工厂@Overridepublic Thread newThread(Runnable r) {//生产新的线程Thread thread = new Thread(group, r, group.getName()+"-thread-"+num.getAndIncrement());thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {@Overridepublic void uncaughtException(Thread t, Throwable e) {System.out.println(t.getName()+"发生异常:"+e.getMessage());}});return thread;}},new RejectedExecutionHandler() {//线程池的拒绝策略@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {throw new RuntimeException("任务队列已满,任务被拒绝");}});//定义任务Runnable task = ()->{try {semaphore.acquire();System.out.println(Thread.currentThread().getName()+"已获得信号量许可,正在运行");Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}finally {semaphore.release();}};for(int i = 0; i < 10; i++){//循环运行10个任务pool.execute(task);}if(Thread.activeCount() > 1){Thread.yield();}pool.shutdown();}}信号量就像是一个资源控制器,在任意时刻,只有获得信号量资源的线程才会运行
相关文章推荐
- Java多线程:Semaphore信号量
- Java多线程之Semaphore信号量
- 多线程 : Java 信号量 Semaphore 使用
- java多线程之Semaphore信号量详解
- Java多线程系列--“JUC锁”11之 Semaphore信号量的原理和示例
- java多线程[5]:信号量(Semaphore)
- Java多线程系列--“JUC锁”11之 Semaphore信号量的原理和示例
- Java多线程-新特征-信号量Semaphore
- Java多线程系列——信号量:Semaphore
- Java多线程-新特征-信号量Semaphore
- JAVA多线程--信号量(Semaphore)
- JAVA多线程--信号量(Semaphore)
- java 多线程-信号量 Semaphore
- Java多线程-新特征-信号量Semaphore
- JAVA多线程--信号量(Semaphore)
- java 多线程-信号量 Semaphore
- JAVA多线程--信号量(Semaphore)
- java多线程之Semaphore信号量详解
- java 多线程-信号量 Semaphore
- java多线程控制-信号量Semaphore