ThreadPoolExecutor线程池配置

来源:互联网 发布:介绍软件的ppt 编辑:程序博客网 时间:2024/05/21 06:11
1.线程队列


ThreadPoolExecutor允许提供一个BlockingQueue来保存等待执行的任务。


基本的任务排队方法有3种:无界队列、有界队列和同步移交(Synchronous Handoff)。
队列的选择与其他的配置参数有关,例如线程池的大小。


newFixedThreadPool和newSingleThreadExecutor在默认的情况下使用一个无界的LinkedBlockingQueue。 如果所有的工作者线程都处于忙绿状态,那么任务将在队列中等候。


在使用有界的工作队列时,队列的大小与线程池的大小必须一起调节。如果线程池小而队列大,那么有助于减少内存使用量,降低CPU的使用率,同时还可以减少上下切换,但是限制了吞吐量。


对于非常大的或者无界的线程池,可以通过使用SynchronousQueue来避免任务排队,以及直接将任务从生产者移交给工作者线程。SynchronousQueue不是一个真正的队列,而是一个线程之间进行移交的机制。要将一个元素放入SynchronousQueue中,必须有另一个线程正在等待接受这个元素。如果没有线程正在等待,并且线程池的当前大小小于最大值,那么ThreadPoolExecutor将创建一个新的线程,否则根据饱和策略,这个任务将被拒绝。
在newCachedThreadPool工厂方法中使用了SynchronousQueue。


2.饱和策略


当有界队列被填满后,饱和策略开始发挥作用。ThreadPoolExecutor的饱和策略可以通过修改调用setRejectExecutionHandler来修改。JDK提供的饱和策略有:AbortPolicy、callerRunsPolicy、DiscardPolicy和DiscardOldPolicy。


callerRunsPolicy(调用者运行)策略实现了一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将某些任务退回到调用者,从而降低新任务的流量。
0 0
原创粉丝点击