一、 线程的任务与策略中的隐性耦合
- 饥饿死锁
一个线程任务如果依赖其他的任务执行结果,那么很容易发生死锁。
例如在单线程Executer(singleThreadPool)中,第一个任务依赖与提交进来的第二个任务,很容易发生饥饿死锁。
如果在更大的线程池中,每个任务都需要等待正在执行中的其他任务时候。同样会发生饥饿死锁。
- 运行较长时间的任务
如果有一个任务执行时间很长,他即使不发生死锁,也会影响其他任务的执行时间,一些话费时间少的小任务也会受到影响,而使得执行时间增加,降低响应效率。
有一种机制可以缓解这种长时间执行完成的任务造成的影响:
限定任务等待资源的时间,而不是要无限的等待下去。在平台类库中的阻塞方法中,都定义了 无限时间等待,与有限时间等待版本。例如: thread.join,Blockqueue.put,countdownLanch.await,以及Selector.select等,如果任务超时,那么将任务标为失败,或者放回队列等待下次的执行。
二、线程池大小
在代码中一般不固定设置,而是通过某种机制动态设定,或者根据Runtime.availableProcessors来动态计算。

三、ThreadPoolExecuter 配置
Executer 的基本实现为 ThreadPoolExecuter。 他是一个灵活稳定的线程池,由Excutors 中的newCachedThreadPool,newFixedThreadPool,newScheduledThreadExcutor等工厂方法返回的。
也可以通过ThreadPoolExecutor的构造方法创建,参数如下:

keepAliveTime 会影响着线程的创建于销毁。。
一开始创建线程池后,不会马上创建对应的核心线程。而是由任务提交后,在创建需要的线程。当然也可以设置XXX启动所有的线程。
四、饱和策略
当任务过载时候,处理的策略就是饱和策略,分为四种。
- AbortPolicy, 2. callerRunPolicy, 3. DiscardPolicy, 4. DiscardOldestPolicy.
忽略策略,2. 调用者执行错略,3. 忽略策略,4. 忽略最老的一个策略
AbortPolicy 终止策略是默认策略,会抛出异常,调用者和接收到异常,然后处理。
- 调用者执行
- 忽略
- 忽略任务队列中,最久没有执行的那个。
至于细节等学到这个地方在详细的学习。
- privilegedThreadFactory
