[java基础]Thread线程池的使用
1. Spring使用线程池
1.1 Policy
常见四种策略如下:
- AbortPolicy: 丢弃任务并抛出
RejectedExecutionException异常。(默认拒绝策略) - DiscardPolicy:丢弃任务,但是不抛出异常。
- DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务。
- CallerRunsPolicy:由调用方线程处理该任务。
如果线程池拒绝策略设置不合理,就容易有坑。我们把拒绝策略设置为DiscardPolicy或DiscardOldestPolicy并且在被拒绝的任务,Future对象调用get()方法,那么调用线程会一直被阻塞。
1.2 Spring Integration
- corePoolSize:队列没满时,线程最大并发数
- maxiumumPoolSizes:队列满后线程能够达到的最大并发数
- keepAliveTime:空闲线程过多久被回收的时间限制
- unit:keepAliveTime的时间单位
- workQueue:阻塞的队列类型
- RejectedExecutionHandler:超出maximumPoolSizes+workQueue时,任务交给RejectedExecutionHandler来处理
@Bean(name = "threadPoolTaskExecutor")
public Executor threadPoolTaskExecutor() {
ThreadPoolTaskExecutor executor=new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setThreadNamePrefix("Nolan-%d");
// 其他参数设置
return new ThreadPoolTaskExecutor();
}
1.3 Submit or Execute
submit提交任务,不会把异常直接这样抛出来
public class ThreadDemo {
public static void main(String[] args) throws Exception {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 5, 1,
TimeUnit.MINUTES, new ArrayBlockingQueue<Runnable>(20),new CustomizableThreadFactory("Nolan-Thread"));
for (int i = 0; i < 5; i++) {
threadPoolExecutor.submit(()->{
System.out.println("current thread name" + Thread.currentThread().getName());
Object object = null;
System.out.print("result## " + object.toString());
});
}
}
}
使用execute方法执行,就可以try...catch捕获异常
public class ThreadDemo {
public static void main(String[] args) throws Exception {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 5, 1,
TimeUnit.MINUTES, new ArrayBlockingQueue<Runnable>(20),new CustomizableThreadFactory("Nolan-Thread"));
for (int i = 0; i < 5; i++) {
threadPoolExecutor.submit(()->{
System.out.println("current thread name" + Thread.currentThread().getName());
try {
Object object = null;
System.out.print("result## " + object.toString());
}catch (Exception e){
System.out.println("异常了"+e);
}
});
}
}
}
1.4 Close
public class ThreadDemo {
public static void main(String[] args) throws Exception {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 5, 1,
TimeUnit.MINUTES, new ArrayBlockingQueue<Runnable>(20), new CustomizableThreadFactory("Tianluo-Thread-pool"));
threadPoolExecutor.execute(() -> {
System.out.println("this is colse demo !");
});
//关闭线程池
threadPoolExecutor.shutdown();
}
}