线程池几个重要参数

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();
}

}
}

java线程池学习(自定义线程池)_抛出异常


源码如下

java线程池学习(自定义线程池)_抛出异常_02


二 回退策略

将执行的任务回退给交付这个任务的人

如main线程

ExecutorService executorService=new  ThreadPoolExecutor(3,8,
2, TimeUnit.SECONDS,new LinkedBlockingDeque<>(3)
, Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy());

java线程池学习(自定义线程池)_System_03


三抛弃策略

将多余的任务抛弃

//修改代码如下
ExecutorService executorService=new ThreadPoolExecutor(3,8,
2, TimeUnit.SECONDS,new LinkedBlockingDeque<>(3)
, Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardPolicy());

最后没有执行100个请求

java线程池学习(自定义线程池)_工作线程_04


四抛弃最老的策略

将最老的线程抛弃,最后也没能执行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();
}

}
}

java线程池学习(自定义线程池)_工作线程_05