关于定时任务及线程池的
基于ThreadPoolTaskSchedule的定时任务
- 配置线程池
@Bean(name = AsyncExecutionAspectSupport.DEFAULT_TASK_EXECUTOR_BEAN_NAME)
public ThreadPoolTaskScheduler threadPoolTaskScheduler(){
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(64);
threadPoolTaskScheduler.setThreadNamePrefix("capture-Executor-");
threadPoolTaskScheduler.setWaitForTasksToCompleteOnShutdown(false);
threadPoolTaskScheduler.setAwaitTerminationSeconds(10);
threadPoolTaskScheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());
log.info("-------------------线程池配置成功-------------------");
return threadPoolTaskScheduler;
}
- 使用
threadPoolTashScheduler.scheduleAt。。。等一系列方法
基于Timer的定时任务
- 创建TimerTask对象,实现run方法
- timer.schedule 方法
基于阿里巴巴规范创建的线程池
-
实现线程工厂(可省略,使用默认工厂)
-
创建线程池,七大参数
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
16,
64,
60L,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(),
threadFactory,
new ThreadPoolExecutor.DiscardOldestPolicy());
核心线程数,最大线程数,线程活跃时间,时间单位,工作队列,线程工厂,线程池拒绝策略
工作队列:
BlockQueue:阻塞队列,先进先出
ArrayBlockingQueue:数组型阻塞队列,需要初始化一定容量
LinkedBlockingQueue: 内部节点关联
SynchronousQueue: 内部容量为0
PriorityBlockingQueue: 无边界设计,容量受系统资源影响
拒绝策略:
AbortPolicy(默认):丢弃任务并抛出 RejectedExecutionException 异常。
CallerRunsPolicy:由调用线程处理该任务。
DiscardPolicy:丢弃任务,但是不抛出异常。可以配合这种模式进行自定义的处理方式。
DiscardOldestPolicy:丢弃队列最早的未处理任务,然后重新尝试执行任务
-
submit或者execute
-
与countdownLatch配合使用
用于控制总体的线程执行边界,比如多线程处理一个列表大小为1000的数据,初始化countdownLatch为size,每次提交线程后,countdownLatch减小,当countdownLatch减至0,(若主线程需等待,执行countdownLatch.await())执行完毕
线程池的创建与销毁
tips:调用shutdown()或者shutdownNow()后,需要重新创建线程池