ThreadPoolExecutor 使用方式

2018-08-17  本文已影响0人  代码人生____

线程池使用:

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时间单位

上一篇下一篇

猜你喜欢

热点阅读