前言: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