多线程并发编程-并发工具类-Semaphore(信号量),流量控制

一、前言:

      Semaphore,从名字看,很难理解所表达的含义,它是用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用公共资源。

二、案例分析:

在代码中,虽然有500个线程,但是只允许30个并发执行:

package com.jason.thread.tool.semaphore;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

/**
 * @program: JasonSpringMybatis
 * @description
 * @author: 大龄程序猿
 * @create: 2020-05-31 12:56
 **/
public class App {
    public static final  int MAX_THREAD=30;
    public static volatile Semaphore  semaphore=new Semaphore(MAX_THREAD);
    public static volatile ExecutorService pool=Executors.newFixedThreadPool(500);

    public static void main(String[] args) {
           for(int i=0;i<5000;i++)
               pool.execute(new Runnable() {
                   @Override
                   public void run() {
                       try {
                           long t1=System.currentTimeMillis();
                           System.out.println("线程ID: "+Thread.currentThread().getId()+
                                   "---当前等待许可证的线程数="+semaphore.getQueueLength()
                                   +"---当前可用的许可证="+semaphore.availablePermits());
                           semaphore.acquire();
                           long t2=System.currentTimeMillis();
                           System.out.println("线程ID:"+Thread.currentThread().getId()+"  execute use time="+(t2-t1));
                           Thread.sleep(5000);
                           semaphore.release();
                       } catch (InterruptedException e) {
                           e.printStackTrace();
                       }
                   }
               });

           pool.shutdown();
    }
}

 

使用手册:

Semaphore(int  permits) 构造方法,接受一个整型的数字,表示可用的许可证数量
int  availablePermits() 返回此信号量中当前可用的许可证数量
int  getQueueLength() 返回正在等待获取许可证的线程数
boolean hasQueueThreads 是否有线程正在等待获取许可证
void  reducePermits(int reduction) 减少reduction个许可证,是个protected方法
Collection getQueuedThreads() 返回所有等待获取许可证的线程集合,是个protected方法

 

你可能感兴趣的:(线程并发)