线程池几个重要参数
public ThreadPoolExecutor( int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
int corePoolSize 默认工作线程数
int maximumPoolSize 最大工作线程数
long keepAliveTime 线程存活时间
TimeUnit unit 线程存活的时间单位
BlockingQueue workQueue 阻塞队列
ThreadFactory threadFactory 线程默认创建工厂
RejectedExecutionHandler handler 线程拒绝策略
线程拒绝策略有四种:
1直接拒绝 超过最大线程数+阻塞的队列数将会报
RejectedExecutionException
如一下代码
public class test1 {
public static void main(String[] args) {
ExecutorService executorService=new ThreadPoolExecutor(3,8,
2, TimeUnit.SECONDS,new LinkedBlockingDeque<>(3)
, Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
try{
for(int i=0;i<=15;i++){
executorService.execute(
()->{
System.out.println(Thread.currentThread().getName()+"\t执行业务");
}
);
}
}catch (Exception e){
System.out.println("抛出异常");
e.printStackTrace();
}
finally {
executorService.shutdown();
}
}
}
源码如下
二 回退策略
将执行的任务回退给交付这个任务的人
如main线程
ExecutorService executorService=new ThreadPoolExecutor(3,8,
2, TimeUnit.SECONDS,new LinkedBlockingDeque<>(3)
, Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy());
三抛弃策略
将多余的任务抛弃
//修改代码如下
ExecutorService executorService=new ThreadPoolExecutor(3,8,
2, TimeUnit.SECONDS,new LinkedBlockingDeque<>(3)
, Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardPolicy());
最后没有执行100个请求
四抛弃最老的策略
将最老的线程抛弃,最后也没能执行100个请求
public class test1 {
public static void main(String[] args) {
/*
ExecutorService executorService=new ThreadPoolExecutor(3,8,
2, TimeUnit.SECONDS,new LinkedBlockingDeque<>(3)
, Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());*/
/**
ExecutorService executorService=new ThreadPoolExecutor(3,8,
2, TimeUnit.SECONDS,new LinkedBlockingDeque<>(3)
, Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy());**/
/**
ExecutorService executorService=new ThreadPoolExecutor(3,8,
2, TimeUnit.SECONDS,new LinkedBlockingDeque<>(3)
, Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardPolicy());**/
ExecutorService executorService=new ThreadPoolExecutor(3,8,
2, TimeUnit.SECONDS,new LinkedBlockingDeque<>(3)
, Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardOldestPolicy());
try{
for(int i=0;i<=100;i++){
executorService.execute(
()->{
try {
TimeUnit.SECONDS.sleep(3);
System.out.println(Thread.currentThread().getName()+"\t执行业务");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
);
}
}catch (Exception e){
System.out.println("抛出异常");
e.printStackTrace();
}
finally {
executorService.shutdown();
}
}
}