`

应用线程池

阅读更多

应用线程池
一、任务与执行策略之间的隐性耦合。
1、有些类型的任务需要明确一个执行的策略,包括:
1)依赖的任务
2)使用线程限制的任务
3)对响应时间敏感的任务
4)使用ThreadLocal的任务
2、线程饥饿死锁(Thread starvation dead)
如果线程中一个任务依赖于其他任务的执行,就可能产生死锁。
3、耗时操作
解决方法:设置阻塞操作的超时时间,如Thread.join, BlockingQueue.put, CountDownLatch.await, Selector.select

二、设置线程池的大小
1、避免线程池的长度硬编码,需要考虑计算环境,资源预算和任务的自身特性
2、公式及定义

三、配置ThreadPoolExecutor
1、ThreadPoolExecutor为Executor提供基本的实现,可以通过它构造自己的Executor。
2、线程的创建与销毁,ThreadPoolExecutor的构造函数的几个参数:corePoolSize,maximumPoolSize,keepAliveTime
3、管理队列任务
ThreadPoolExecutor允许提供一个BlockingQueue来持有等待执行的任务。
任务排队的方式有三种: 无限队列,有限队列,同步移交
如何避免资源耗尽。
4、饱和策略
1)通过setRejectedExecutionHandler来修改ThreadPoolExecutor的饱和策略。
2)JDK提供了几种不同的RejectedExecutionHandler的实现,实现了不同的策略AbortPolicy,CallerRunsPolicy,DiscardPolicy,DiscardOldestPolicy
AbortPolicy :引起execute抛出未检查的RejectedExecutionException,调用者可以捕获这个异常,进行处理
DiscardPolicy:当新提交的任务不能进入队列等待执行的时候,discard会默认放弃这个任务。
DiscardOldestPolicy:策略选择丢弃的任务,放弃即将执行的任务,重新提交新任务。
CallerRunsPolicy:既不抛异常,也不抛弃任务。它把一些任务退回给调用者,以减缓任务流。
3)使用semaphore来抑制任务提交。
4)线程工厂ThreadFactory,接口只有一个方法newFactory
5、扩展ThreadPoolExecutor
1)提供几个函数让子类去重写 beforeExecute(),afterExecute(),terminate()
无论任务是从run()中返回,还是抛出异常,afterExecute都会被执行;
如果beforeExecute抛出一个runtimeException,任务将不被执行,afterExecute也不会被调用。
terminate 在线程池完成关闭后调用。
6、并行递归算法
1)顺序执行改为并行执行。
2)谜题框架

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics