流程图
1.怎么在空闲情况下回收核心线程
默认情况下,当空闲时,核心线程保持alive,非核心线程会超时回收掉,超时时间用参数keepAliveTime控制。也可以超时回收核心线程,只需把参数allowCoreThreadTimeOut置为true,方法allowCoreThreadTimeOut(boolean value)
2.怎么获取线程池中创建的线程数量
getPoolSize()
3.怎么获取线程池中正在执行任务的线程数量
getActiveCount()
4.怎么在创建线程池时就把core线程创建好
prestartAllCoreThreads()
5.怎么获取线程池中已经执行完成的任务数量
getCompletedTaskCount()
6.怎么获取线程池中任务数量(已完成的+正在执行的)
getTaskCount()
7.怎么查询已提交但未完成的任务数量
参考tomcat中的线程池ThreadPoolExecutor,重写execute(Runnable command)方法,在里面增加数据,重写afterExecute(Runnable r,Throwable t),在里面减少数量
8.怎么让提交的任务直接创建线程去执行,而不是先放在阻塞队列中等满了之后再创建线程去执行
参与tomcat的线程池ThreadPoolExecutor中阻塞队列TaskQueue的实现,重写了offer()方法,
当parent.getPoolSize<parent.getMaximumPoolSize()时返回false
9.ThreadPoolExecutor$Worker要锁干什么?
instead interruption a task being run,加锁以后线程池shutdown时需要先拿到锁,即要等线程池中的线程正在执行的task(阻塞队列中的也算)执行完成后再中止线程
10.shutdown与shutdownNow的区别
相同点:停止接收外部submit的任务
不同点:
shutdown:会执行完内部正在跑的任务和队列中等待的任务
shutdownNow: (1)忽略队列里等待的任务
(2)尝试将正在跑的任务interrupt中断
(3)返回未执行的任务列表(阻塞队列中的任务)
shutdownNow它试图终止线程的方法是通过调用Thread.interrupt()来实现的,调用interrupt方法并不意味着立即停止目标线程正在进行的工作,而只是传递了请求中断的消息。所以 ,showdownNow并不代表线程池就一定立即退出,它可能必须要等待所有正在执行的任务执行完了才退出
11.awaitTermination(long timeout,TimeUnit unit)的作用
超时阻塞当前线程,返回线程池是否是已经terminated
这个方法与shutdown或者shutdownNow方法一起使用
12.线程池用32位的AtomicInteger数表示线程池的状态及正在运行的线程数,高3位是状态,低29位是线程数量
111 00000000000000000000000000000 running(负数)
000 00000000000000000000000000000 shutdown
001 00000000000000000000000000000 stop
010 00000000000000000000000000000 tidying
011 00000000000000000000000000000 terminated