概念
core 核心线程数 # 线程池内线程数量
max 最大线程数 # 线程池可同时执行的最大线程数 =线程池核心线程数+ 非线程池核心线程数。不可小于核心线程数
timeout 超时时间 #非线程池核心线程使用完后,等待销毁时间
queue 等待队列 #超过最大线程数阻塞队列数
java.lang.Runtime.availableProcessors() #方法: 返回可用处理器的Java虚拟机的数量
线程池操作
基本操作
threadPool.execute(thread) #传入线程,无返回值
threadPool.submit (thread) #传入线程,有返回值
threadPool.shutdown(); #销毁线程池 ,不接收新线程,线程池内已运行的线程j继续执行,销毁后的线程池无法在提交线程任务
threadPool.shutdownNow(); #同shutdown ,但会触发线程中断标记Interrupted ,可在线程中判断中断代码,sleep、join、wait方法在中断标记中抛InterruptedException异常
threadPool.awaitTermination(1, TimeUnit.SECONDS)); #阻塞,直到线程池关闭所有任务执行完成,或发生超时,或当前线程中断
查询
threadPool.isShutdown(); # 判断线程池是否已经关闭
threadPool.isTerminated(); # 判断任务全部执行完毕,并且线程池已经关闭,才会返回true
threadPool.getPoolSize() #查询线程池中的线程数
移除线程池中排队任务
threadPool.remove(runnable); #运行中的任务不能移除,submit()运行无法移除
设置允许核心线程超时销毁
threadPool.allowCoreThreadTimeOut(true) #必须在任务提交前设置,ture允许,false不允许,不传查询
核心线程预启动
threadPool.prestartAllCoreThreads() #启动全部核心线程,返回成功启动数量
threadPool.prestartCoreThread() #启动一个核心线程,返回boolean
线程池类型
CachedThreadPool(ThreadFactory)
传入线程可重复利用(缓存特性)。没有核心线程数,没有最大线程数限制,线程最大空闲时间60s,队列无数量。具有缓存性质的线程池,适合任务耗时短,数量大,线程可复用。
ExecutorService threadPool = Executors.newCachedThreadPool(); #60秒无线程任务会销毁
FixedThreadPool(ThreadFactory)
具有固定数量的线程池(一般cpu核数*20),核心线程数和最大线程数一致,线程最大空闲时间为0,执行完毕即销毁,超出最大线程数进行等待。高并发下控制性能。
ExecutorService threadPool = Executors.newFixedThreadPool(8); #不会销毁,手动shutdown
ScheduledThreadPool(ThreadFactory)
必须初始化核心线程数,底层使用DelayedWorkQueue实现延迟特性。具有时间调度特性的线程池
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(1);
scheduledThreadPool.schedule(runnable, 3, TimeUnit.SECONDS); #指定时间后执行
scheduledThreadPool.scheduleAtFixedRate(task, 0, 2, TimeUnit.SECONDS); #周期性时间调度
scheduledThreadPool.scheduleWithFixedDelay(task, 0, 2, TimeUnit.SECONDS); #执行完后指定时间周期调度
scheduleWithFixedDelay.cancel(false); #打断周期调度 ,true直接打断 ,false友好打断
SingleThreadExecutor(ThreadFactory)
核心线程数与最大线程数均为1,用于不需要并发的顺序执行。
自定义线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(3,7,60,TimeUnit.SECONDS,new LinkedBlockingQueue
());# 核心线程数 , 最大线程数 ,超时时间 ,队列 超出策略
AbortPolicy 超出队列的线程,抛异常
ThreadPoolExecutor executor = new ThreadPoolExecutor(3,3,0,TimeUnit.SECONDS,new LinkedBlockingQueue
(1),new AbortPolicy ()); CallerRunsPolicy 超出队列的线程,优先由主线程运行,线程池内线程等待主线程运行完毕后执行
ThreadPoolExecutor executor = new ThreadPoolExecutor(3,3,0,TimeUnit.SECONDS,new LinkedBlockingQueue
(1),new CallerRunsPolicy ()); DiscardOldestPolicy 超出队列的线程时,丢弃最老的任务,替换超出的线程
ThreadPoolExecutor executor = new ThreadPoolExecutor(3,3,0,TimeUnit.SECONDS,new LinkedBlockingQueue
(1),new DiscardOldestPolicy ()); DiscardPolicy超出队列的线程时 ,直接丢弃,什么也不做
ThreadPoolExecutor executor = new ThreadPoolExecutor(3,3,0,TimeUnit.SECONDS,new LinkedBlockingQueue
(1),new DiscardPolicy ()); ThreadPoolExecutor executor = new ThreadPoolExecutor(3,3,0,TimeUnit.SECONDS,new LinkedBlockingQueue
(1),new MyPolicy()); RejectedExecutionHandler 重写方法,自定义超出策略
上免4类超出策略,都实现了RejectedExecutionHandler接口
ThreadPoolExecutor executor = new ThreadPoolExecutor(3,3,0,TimeUnit.SECONDS,new LinkedBlockingQueue
(1),new RejectedExecutionHandler(){ @Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
System.out.println(r+"被拒绝执行"+System.currentTimeMillis()); }
});