ThreadPoolExecutor 使用方式
线程池使用:
ThreadFactory namedThreadFactory = new ThreadFactoryBuilder()
.setNameFormat("pool-%d").build();
ThreadPoolExecutor execServiceChores = new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime, TimeUnit.MILLISECONDS,new SynchronousQueue(),
namedThreadFactory, new ThreadPoolExecutor.CallerRunsPolicy());
setNameFormat("名字"):给线程池设置名字
corePoolSize:核心线程数
maximumPoolSize:最大线程数
keepAliveTime:当线程池里面线程没有任务保持活跃时间
TimeUnit:时间单位
SynchronousQueue:线程池使用队列类型
ArrayBlockingQueue数组形式存储容量固定
SynchronousQueue没有容量
LinkedBlockingQueue链表形式存储容量固定
PriorityBlockingQueue二叉堆实现的优先级阻塞队列
ThreadPoolExecutor.CallerRunsPolicy():线程池使用策略
AbortPolicy当线程池任务数量达到上限终止添加任务
CallerRunsPolicy重试添加当前的任务,他会自动重复调用execute()方法
DiscardOldestPolicy抛弃旧的任务
DiscardPolicy抛弃当前的任务
线程池关闭
pool.shutdown();
try {
if (!pool.awaitTermination(10, TimeUnit.SECONDS)) {
pool.shutdownNow(); // Cancel currently executing tasks
if (!pool.awaitTermination(10, TimeUnit.SECONDS)) {
System.err.println("Pool did not terminate");
}
}
} catch (InterruptedException ie) {
pool.shutdownNow();
Thread.currentThread().interrupt();
}
线程池定时任务使用
使用ScheduledExecutorService替代Timer,应为Timer执行任务中如果出现异常任务不执行,ScheduledExecutorService出现异常任务继续执行
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(() -> {"执行任务"},
initialDelay,period,unit);
)
initialDelay等待多长时间执行
period执行任务周期
unit时间单位