线程池

来源:互联网 发布:算法导论英文版 pdf 编辑:程序博客网 时间:2024/06/05 19:53

线程池:

a)     线程池的原因:

                i.         虽然与进程相比,线程是一种轻量级的工具,但其创建和关闭依然需要花费时间,如果为每一个小的任务都创建一个线程,很有可能出现创建和销毁线程所占用的时间大于该线程真实工作所消耗的时间的情况,反而会得不偿失。

               ii.         对线程的使用必须要有一个度,在有限的范围内,增加线程的数量可以明显提高系统的谈吐量,但一旦超出了这个范围,大量的线程只会拖垮应用系统。因此,在生产环境中使用线程,必须对其加以控制和管理

为了避免系统频繁地创建和销毁线程,我们可以让创建的线程进行复用。

a)     线程池内部实现

                i.         public ThreadPoolExecutor(int corePoolSize,

                                                                             int maximumPoolSize,

                                                                             long keepAliveTime,

                                                                            TimeUnit unit,

                                                                            BlockingQueue<Runnable> workQueue,

                                                                            ThreadFactory threadFactory,

                                                                            RejectedExecutionHandler handler)

corePoolSize:指定了线程池中线程的数量

maximumPoolSize:指定了线程池中的最大线程数量

keepAliveTime:当线程池线程数量超过corePoolSize时,多余的空闲线程的存活时间

unit:keepAliveTime的单位

workQueue:任务队列,被提交但尚未被执行的任务

threadFactory:线程工厂,用于创建线程,一般用默认的即可

handler:拒绝策略,当任务太多来不及处理,如何拒绝任务

a)     Handler四种拒绝策略

                i.         AbortPolicy:该策略直接抛出异常,阻止系统正常工作,默认的拒绝策略。

               ii.         CallerRunsPolicy:只要线程池未关闭,该策略直接在调用者线程中,运行当前被丢弃的任务。

              iii.         DiscardOldestPolicy:丢弃最老的一个请求,也就是即将被执行的一个任务,并尝试再次提交当前任务。

DiscardPolicy:默默丢弃无法处理的任务,不予任何处理。



原创粉丝点击