任务/线程池等

考虑单线程和一个任务一个线程的不足(线程创建销毁开销,对资源的竞争)
Executor 异步,任务提交和执行解耦,考虑执行策略, 任务独立(不独立导致线程饥饿死锁,运行中任务依赖队列中任务)且同构(运行时间长的任务霸占线程,时间短的任务响应很慢)这样才能发挥并发执行的威力
线程池:0-core,队列,core-max,reject,没有prestartCoreThread或prestartAllCoreThreads开始没有线程
线程数量 计算密集:cpu+1,1是某线程偶尔暂停也不会浪费cpu,IO密集: cpu*(总时间/计算时间)
除cpu资源外,其他资源也可能限制,线程数=资源总数/单任务所需资源数
rejectedExecutionHanlder: shutdown(Now)或超过max使用,默认abort(异常),discard,discardOldest(队头马上就要运行的,然后尝试重新提交),callerRuns
平缓处理:callerRuns导致不调用accept,导致请求堆积在TCP层队列,最后TCP层丢弃
放入队列无阻塞offer(),worker thread从队列取 当前未超过core用take(),超过core用限定keepAliveTime的poll()
四个扩展点:单个任务执行前后beforeExecute,afterExecute,线程池关闭完成后terminated
newTaskFor:Runnable或Callable如何封装成RunnableFuture(一般给我们的是FutureTask)
fixed(core=max,linkedblockingqueue(没传capacity, 即无界的,即Integer的最大值))
single(core=max=1, 没传capacity的lbq,这个线程结束会补个,unconfigurableExecutorService封装保证用户不会修改其配置,保证任务不会并发执行,避免同步)
cached(core=0,max=Integer的最大值,synchronousqueue,若没有woker thread在poll()就offer()失败然后创建线程)
scheduled 延迟或定时
先关闭executor(含非守护线程),jvm才能退出
shutdown
shutdownNow 尝试取消运行中任务
Timer scheduleAtFixedRate(0,10,20固定时间点触发,有一个太长导致超过时间点,连续触发来进行补偿) schedule(固定延时),任务抛出rt,导致唯一线程挂掉,所以应用ScheduledThreadPoolExecutor
CompletionService(实现ExecutorCompletionService): 任务完成调用future的done()方法,里面将future放入blockingqueue,从中可按完成时间依次获取完成的future
java没有安全终止线程的机制,考虑协作方式,轮询标志(阻塞方法怎么办),考虑中断
中断只用于取消,而取消有多种方式,其中中断最为合理
可中断阻塞方法:入口处和阻塞过程中都响应中断,清除中断状态并抛出InterruptedException,对这个响应可以传递异常或恢复中断状态,或者一些不可取消的任务循环调用阻塞方法,中途有被中断过在finally里恢复中断状态
线程有其中断策略,中断某线程先搞清楚其中断策略,
中断线程池某工作线程意味取消当前任务并关闭工作线程,可能创建新的补上
任务可以响应中断但一定要保留中断否则线程就看不到了,
线程所有者为创建线程的类,线程池是其工作线程的所有者,中断或对工作线程的其他操作应由线程池去完成,我们不会直接中断工作线程,但调用shutdown和future.cancel(true)这样的取消机制来借所有者之手完成中断,应用关闭服务,服务关闭其线程(shutdown)
不可中断的阻塞如何取消
socket IO 的读写可Socket.close()来取消,抛出SocketException
InterruptibleChannel: 两种取消方式
关闭Channel导致阻塞在Channel上线程抛出AsynchronousCloseException
中断某在Channel上阻塞线程导致Channel被关闭且所有阻塞线程抛出ClosedByInterruptException
Selector wakeup或close(ClosedSelectorException)
RuntimeException: 导致线程退出,默认会system.err输出线程堆栈,Thread.uncaughtExceptionHandler可改变这种默认行为, 但在线程池我们需要得知线程异常退出情况并做些处理(如可能新建线程进行补充),用到finally
正常关闭:所有非守护线程退出,System.exit(),SIGINT
强行关闭:SIGKILL(强杀进程),Runtime.halt()
正常关闭: shutdownhook, 若runFinalizersOnExit为true则运行终结器(设定为true的方法已经被Deprecated,想想看对象还是active的,你就运行其finialize()方法,线程不安全),最后强行结束所有线程(守护如System.exit()和非守护)
守护状态会继承, 守护线程少用因为其jvm最后停止时被强停(没有清理工作),尽量避免使用终结器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值