【并发编程】使用Semaphore来遏制任务的提交

前言:ThreadPoolExecutor中提交一个LinkedBlockingQueue来表示请求等待队列的长度,该队列有助于减缓瞬时任务激增带来的压力,但任务提交速度过快时,还是需要遏制任务的提交,以免耗尽内存,【即使没有耗尽,也会随着队列长度的激增响应时间也会变慢】,可以使用Semaphore来限制任务的提交量,限制当前执行的任务数和等待执行的任务数,即期望限制当前线程池加上允许排队等待的线程数。

程序清单:

import java.util.concurrent.Executor;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.Semaphore;

/**
 *
 * @Date : 2017/5/17 9:54
 * @Version : 1.0.0
 * 请求遏制
 */

public class BoundedExecutor {

    private Semaphore semaphore;
    private Executor executor;

    public BoundedExecutor(Semaphore semaphore,Executor executor){
        this.semaphore = semaphore;
        this.executor = executor;
    }

    public void submitTask(final Runnable command){
        try {
            semaphore.acquire();
            System.out.println(Thread.currentThread().getName()+" acquire: "+semaphore.availablePermits());
            executor.execute(new Runnable() {
                @Override
                public void run() {
                    try{
                        command.run();
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } finally {
                        System.out.println("current Thread: "+Thread.currentThread().getName()+" task end: "+semaphore.availablePermits());
                        semaphore.release();
                    }
                }
            });
        } catch (InterruptedException e) {
            e.printStackTrace();
        }catch (RejectedExecutionException e){
            semaphore.release();
        }
    }
}
测试类:

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 
 * @Date : 2017/5/17 10:00
 * @Version : 1.0.0
 */

public class BoundTest {
    private static final AtomicInteger threadNumber = new AtomicInteger(1);
    private static final AtomicInteger poolNumber = new AtomicInteger(1);
    private static String namePrefix;
    static final ExecutorService executorService = new ThreadPoolExecutor(3,5,10,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(3),new MyThreadFactory());
    static final Semaphore semaphore = new Semaphore(3);
    public static void main(String[] args){
        BoundedExecutor boundedExecutor = new BoundedExecutor(semaphore,executorService);
        for(int i = 0;i < 100;i++){
            boundedExecutor.submitTask(new Runnable() {
                @Override
                public void run() {
                    System.out.println("current thread: "+Thread.currentThread().getName()+" do my job running..........");
                }
            });
        }
    }
    static class MyThreadFactory implements ThreadFactory{

        public MyThreadFactory(){
            namePrefix = "mypool- "+poolNumber.getAndIncrement()+" -mythread- ";
        }

        @Override
        public Thread newThread(Runnable r) {
            Thread thread = new Thread(r,namePrefix+threadNumber.getAndIncrement());
            return thread;
        }
    }



}
采用自定义线程工厂:
 public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory)
corePoolSize:当前线程池核心线程数,维护池的大小,即当前没有任务执行时,池的大小也为核心x池的大小。

maximumPoolSize:最大线程数,当核心线程数和请求队列长度满时,当前线程池才会创建新的线程,最大线程数为线程池的上限

如果一个线程空闲时间大于keepAliveTime存活时间,就会成为一个候选回收者,如果当期池的大小超过核心线程池数,线程池会终止它。

keepAliveTime:回收占用资源,从而更好的利用资源。

运行结果:

main acquire: 2
main acquire: 1
main acquire: 0
current thread: mypool- 1 -mythread- 1 do my job running..........
current thread: mypool- 1 -mythread- 2 do my job running..........
current thread: mypool- 1 -mythread- 3 do my job running..........
current Thread: mypool- 1 -mythread- 1 task end: 0
current Thread: mypool- 1 -mythread- 3 task end: 1
current Thread: mypool- 1 -mythread- 2 task end: 0
main acquire: 1
main acquire: 1
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current thread: mypool- 1 -mythread- 1 do my job running..........
current thread: mypool- 1 -mythread- 2 do my job running..........
current Thread: mypool- 1 -mythread- 1 task end: 0
current Thread: mypool- 1 -mythread- 3 task end: 0
main acquire: 0
current Thread: mypool- 1 -mythread- 2 task end: 1
current thread: mypool- 1 -mythread- 1 do my job running..........
main acquire: 0
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current thread: mypool- 1 -mythread- 2 do my job running..........
current Thread: mypool- 1 -mythread- 2 task end: 0
current Thread: mypool- 1 -mythread- 1 task end: 1
main acquire: 1
main acquire: 0
current thread: mypool- 1 -mythread- 2 do my job running..........
current thread: mypool- 1 -mythread- 1 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
current Thread: mypool- 1 -mythread- 2 task end: 1
current Thread: mypool- 1 -mythread- 1 task end: 2
main acquire: 2
main acquire: 1
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current thread: mypool- 1 -mythread- 2 do my job running..........
current thread: mypool- 1 -mythread- 1 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
current Thread: mypool- 1 -mythread- 1 task end: 1
current Thread: mypool- 1 -mythread- 2 task end: 2
main acquire: 2
main acquire: 1
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current thread: mypool- 1 -mythread- 1 do my job running..........
current thread: mypool- 1 -mythread- 2 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
current Thread: mypool- 1 -mythread- 2 task end: 1
current Thread: mypool- 1 -mythread- 1 task end: 2
main acquire: 2
main acquire: 1
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current thread: mypool- 1 -mythread- 2 do my job running..........
current thread: mypool- 1 -mythread- 1 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
current Thread: mypool- 1 -mythread- 1 task end: 1
current Thread: mypool- 1 -mythread- 2 task end: 2
main acquire: 2
main acquire: 1
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current thread: mypool- 1 -mythread- 1 do my job running..........
current thread: mypool- 1 -mythread- 2 do my job running..........
current Thread: mypool- 1 -mythread- 2 task end: 0
current Thread: mypool- 1 -mythread- 3 task end: 1
current Thread: mypool- 1 -mythread- 1 task end: 1
main acquire: 2
main acquire: 1
main acquire: 0
current thread: mypool- 1 -mythread- 2 do my job running..........
current thread: mypool- 1 -mythread- 3 do my job running..........
current thread: mypool- 1 -mythread- 1 do my job running..........
current Thread: mypool- 1 -mythread- 1 task end: 0
current Thread: mypool- 1 -mythread- 2 task end: 1
main acquire: 1
main acquire: 0
current thread: mypool- 1 -mythread- 1 do my job running..........
current thread: mypool- 1 -mythread- 2 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
current Thread: mypool- 1 -mythread- 2 task end: 1
current Thread: mypool- 1 -mythread- 1 task end: 1
main acquire: 0
main acquire: 1
main acquire: 0
current thread: mypool- 1 -mythread- 2 do my job running..........
current thread: mypool- 1 -mythread- 1 do my job running..........
current thread: mypool- 1 -mythread- 3 do my job running..........
current Thread: mypool- 1 -mythread- 1 task end: 0
current Thread: mypool- 1 -mythread- 3 task end: 0
main acquire: 1
current Thread: mypool- 1 -mythread- 2 task end: 1
current thread: mypool- 1 -mythread- 1 do my job running..........
main acquire: 0
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current thread: mypool- 1 -mythread- 2 do my job running..........
current Thread: mypool- 1 -mythread- 1 task end: 0
current Thread: mypool- 1 -mythread- 2 task end: 0
main acquire: 0
main acquire: 0
current thread: mypool- 1 -mythread- 1 do my job running..........
current thread: mypool- 1 -mythread- 2 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current Thread: mypool- 1 -mythread- 1 task end: 0
main acquire: 0
current Thread: mypool- 1 -mythread- 2 task end: 0
current thread: mypool- 1 -mythread- 2 do my job running..........
main acquire: 0
current thread: mypool- 1 -mythread- 1 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
current Thread: mypool- 1 -mythread- 2 task end: 1
current Thread: mypool- 1 -mythread- 1 task end: 2
main acquire: 2
main acquire: 1
current thread: mypool- 1 -mythread- 3 do my job running..........
main acquire: 0
current thread: mypool- 1 -mythread- 2 do my job running..........
current thread: mypool- 1 -mythread- 1 do my job running..........
current Thread: mypool- 1 -mythread- 1 task end: 0
current Thread: mypool- 1 -mythread- 2 task end: 0
main acquire: 0
main acquire: 0
current thread: mypool- 1 -mythread- 1 do my job running..........
current thread: mypool- 1 -mythread- 2 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
current Thread: mypool- 1 -mythread- 1 task end: 0
main acquire: 1
main acquire: 0
current Thread: mypool- 1 -mythread- 2 task end: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
main acquire: 0
current thread: mypool- 1 -mythread- 1 do my job running..........
current thread: mypool- 1 -mythread- 2 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
current Thread: mypool- 1 -mythread- 1 task end: 0
main acquire: 1
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current thread: mypool- 1 -mythread- 1 do my job running..........
current Thread: mypool- 1 -mythread- 2 task end: 0
main acquire: 0
current thread: mypool- 1 -mythread- 2 do my job running..........
current Thread: mypool- 1 -mythread- 1 task end: 0
main acquire: 0
current Thread: mypool- 1 -mythread- 2 task end: 0
current thread: mypool- 1 -mythread- 1 do my job running..........
main acquire: 0
current Thread: mypool- 1 -mythread- 3 task end: 0
current thread: mypool- 1 -mythread- 2 do my job running..........
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current Thread: mypool- 1 -mythread- 1 task end: 0
main acquire: 0
current thread: mypool- 1 -mythread- 1 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current Thread: mypool- 1 -mythread- 2 task end: 0
main acquire: 0
current thread: mypool- 1 -mythread- 2 do my job running..........
current Thread: mypool- 1 -mythread- 1 task end: 0
main acquire: 0
current thread: mypool- 1 -mythread- 1 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current Thread: mypool- 1 -mythread- 1 task end: 0
main acquire: 0
current thread: mypool- 1 -mythread- 1 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current Thread: mypool- 1 -mythread- 2 task end: 0
main acquire: 0
current Thread: mypool- 1 -mythread- 1 task end: 0
current thread: mypool- 1 -mythread- 2 do my job running..........
main acquire: 0
current thread: mypool- 1 -mythread- 1 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current Thread: mypool- 1 -mythread- 1 task end: 0
current Thread: mypool- 1 -mythread- 2 task end: 1
main acquire: 1
main acquire: 0
current thread: mypool- 1 -mythread- 1 do my job running..........
current thread: mypool- 1 -mythread- 2 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current Thread: mypool- 1 -mythread- 1 task end: 0
main acquire: 0
current thread: mypool- 1 -mythread- 1 do my job running..........
current Thread: mypool- 1 -mythread- 2 task end: 0
main acquire: 0
current thread: mypool- 1 -mythread- 2 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current Thread: mypool- 1 -mythread- 1 task end: 0
current Thread: mypool- 1 -mythread- 2 task end: 1
main acquire: 0
main acquire: 0
current thread: mypool- 1 -mythread- 1 do my job running..........
current thread: mypool- 1 -mythread- 2 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current Thread: mypool- 1 -mythread- 1 task end: 0
main acquire: 0
current Thread: mypool- 1 -mythread- 2 task end: 0
current thread: mypool- 1 -mythread- 1 do my job running..........
main acquire: 0
current thread: mypool- 1 -mythread- 2 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
current Thread: mypool- 1 -mythread- 1 task end: 1
main acquire: 1
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current Thread: mypool- 1 -mythread- 2 task end: 0
current thread: mypool- 1 -mythread- 1 do my job running..........
main acquire: 0
current thread: mypool- 1 -mythread- 2 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
current Thread: mypool- 1 -mythread- 2 task end: 1
current Thread: mypool- 1 -mythread- 1 task end: 2
main acquire: 2
main acquire: 1
current thread: mypool- 1 -mythread- 3 do my job running..........
current thread: mypool- 1 -mythread- 2 do my job running..........
main acquire: 0
current thread: mypool- 1 -mythread- 1 do my job running..........
current Thread: mypool- 1 -mythread- 1 task end: 0
current Thread: mypool- 1 -mythread- 2 task end: 0
main acquire: 1
main acquire: 0
current thread: mypool- 1 -mythread- 1 do my job running..........
current thread: mypool- 1 -mythread- 2 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
current Thread: mypool- 1 -mythread- 2 task end: 1
current Thread: mypool- 1 -mythread- 1 task end: 2
main acquire: 2
main acquire: 1
current thread: mypool- 1 -mythread- 3 do my job running..........
main acquire: 0
current thread: mypool- 1 -mythread- 2 do my job running..........
current thread: mypool- 1 -mythread- 1 do my job running..........
current Thread: mypool- 1 -mythread- 1 task end: 0
main acquire: 0
current thread: mypool- 1 -mythread- 1 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
current Thread: mypool- 1 -mythread- 2 task end: 0
main acquire: 0
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current thread: mypool- 1 -mythread- 2 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
current Thread: mypool- 1 -mythread- 2 task end: 0
current Thread: mypool- 1 -mythread- 1 task end: 2
main acquire: 2
main acquire: 1
main acquire: 0
current thread: mypool- 1 -mythread- 3 do my job running..........
current thread: mypool- 1 -mythread- 2 do my job running..........
current thread: mypool- 1 -mythread- 1 do my job running..........
current Thread: mypool- 1 -mythread- 1 task end: 0
current Thread: mypool- 1 -mythread- 3 task end: 0
main acquire: 0
main acquire: 0
current thread: mypool- 1 -mythread- 1 do my job running..........
current Thread: mypool- 1 -mythread- 2 task end: 1
current thread: mypool- 1 -mythread- 3 do my job running..........
main acquire: 0
current thread: mypool- 1 -mythread- 2 do my job running..........
current Thread: mypool- 1 -mythread- 3 task end: 0
current Thread: mypool- 1 -mythread- 1 task end: 1
current Thread: mypool- 1 -mythread- 2 task end: 2



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值