ThreadPoolExecutor

流程图

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值