本系列文章导航
深入浅出Java多线程(1)-方法 join
深入浅出Java多线程(2)-Swing中的EDT(事件分发线程)
深入浅出多线程(3)-Future异步模式以及在JDK1.5Concurrent包中的实现
深入浅出多线程(4)对CachedThreadPool OutOfMemoryError难题的一些想法
深入浅出多线程(5)以并行包线程池为例说说线程池的设计需求及使用
深入浅出多线程(6)分析并行包线程池的设计与实现
接深入浅出多线程系列4,
线程对象的创建和销毁是需要花费系统资源的,通过线程池,可以避免该问题并提高系统的响应时间。这种情形类似我们常提到的数据库连接池。
线程池的广泛应用使得在SUN在JDK 1.5的工具包提供了线程池的支持。我计划将该系列分为设计需求与设计实现两个部分。这样会更加清晰。如果想要熟悉,并熟练应用线程池,那么通过设计需求篇也就是该篇就可以找到答案。如果想探究实现的细节,那么在设计实现篇会有深入的说明。
本文以Concurrent包线程池设计为例,讨论线程池的设计。
线程池需求
设计与实现的最终目标是满足需求,这是软件开发的基本原则。我们先考虑考虑对线程池的需求。作为一名开发人员,我们最主要的需求就是线程池简单,易用。即使你的设计算法多么优雅,但给使用者复杂的使用步骤也是得不偿失,简单就是美!最好我们不用深究你的具体实现,通过简单的接口就可以应用。其次就是技术角度,线程池的设计应该是比较柔性的,提供很好的可配置可管理与可扩张性。
对于可配置可管理的需求,至少的提供以下的功能点:
线程池里,线程数量的配置。
能够提供动态调整线程的数量。
能够Shutdown 最好能够提供优雅的Shundown,而不是像我们通过切断电源关闭机器那样粗暴的Shutdown。
能够提供Task的状态,比如完成了多少,还有多少没有完成。
对于可扩展性而言有以下几点:
如果不能满足需要能够很容易的扩展。
对于线程池线程的创建能否提够扩展。
当提交的Task负载过大时,线程池的处理策略能否扩展。
以上是对线程池的需求的讨论。
2.上面就这些对于我们使用者而言,对线程池的需求,下面我们分析Concurrent包提供的线程池是否达到了我们的需求。
对于易用的需求。
Concurrent的Executors类,注意不是Executor接口,通过Factory模式提供了我们以下的基本的线程池,如果没有
特殊的需求,只需查阅这几个线程池JDK文档,就可以使用了。
newFixedThreadPool 顾名思义,建立固定大小的线程池。
newCachedThreadPool 根据需要动态的创建线程,该线程池我们在深入系列4做了讨论。
newSingleThreadExecutor 如其名。
newScheduledThreadPool 如其名,该线程池类似于JDK1.4 Timer提供的功能,但更完善,我会在随后的深入浅出系列讨论其不同 点。
总之,从易用性的角度见,Concurrent包提供的接口是不错的。
对于可配置,可管理讲:
提供了可以配置线程池中线程的数量的功能。比如在创建newFixedThreadPool时,第一个参数就是线程池线程的数量,通过
该数量的配置,我们就可以保证不会因为线程的过多导致系统的崩溃。
提供了在运行时通过setCorePoolSize和setMaximumPoolSize方法来调整线程池数量的功能,两者的区别会在后续实现篇中说明。
提够了优雅的Shutdown,不在接受Task,将正在运行的Task执行完,处于等待状态的Task 中断。
提供getTaskCount和getCompletedTaskCount方法可以获取提交的Task和完成的Task数量。
对于可扩展性
我们可以参考Executors的Factory模式,扩展提供满足需要的线程池。
在构造方法中,提供ThreadFactory接口,我们可以实现自定义的创建线程池线程的方法。
提供了RejectedExecutionHandler接口,我们可以扩张该接口,提供当Task过多时,处理策略,目前默认为AbortPolicy策略Throw 一个RejectedExecutionException
总之,Concurrent中Executors类通过Factory Method方法,提供了基本常用的线程池。 Executors 其实通过线程池实现类-ThreadPoolExecutor创建基本的线程池,所以我们可以通过ThreadPoolExecutor提供的API来配置扩展来实现个性化需求的线程池。
博文来源:http://www.cqzol.com/programming/580436.html
分享到:
相关推荐
使用线程池管理多线程上传,包含了文件拆分,文件分片多线程上传,单文件上传。多线程执行任务等待管理。拒绝直接new Thread创建新线程导致的诸多问题
源码演示了多线程写法,主要是对比精易模块线程池,鱼刺模块线程池。@在人间。
java多线程,对多线程,线程池进行封装,方便使用
主要介绍了Java8并行流中自定义线程池操作,结合实例形式分析了并行流的相关概念、定义及自定义线程池的相关操作技巧,需要的朋友可以参考下
深入浅出 Java 多线程.pdf
1.资源简介:PyQt5中使用多线程模块QThread解决了PyQt5界面程序执行比较耗时操作时,程序卡顿出现的无响应以及界面输出无法实时显示的问题,采用线程池ThreadPoolExecutor解决了ping多个IP多任务耗时问题。...
介绍一个通用多线程服务模块。是利用jdk线程池,多线程并行处理多任务,以提高执行效率。
深入浅出Java多线程程序设计
线程、多线程和线程池面试专题.线程、多线程和线程池面试专题.线程、多线程和线程池面试专题.线程、多线程和线程池面试专题.
创建多线程操作是非常昂贵的,如果每个运行时间非常短的操作,都创建多线程进行操作,可能并不能提高效率,反而降低... 如果你有非常多的执行时间非常短的操作,那么适合作用线程池来提高效率,而不是自行创建多线程。
深入浅出Java多线程.doc深入浅出Java多线程.doc深入浅出Java多线程.doc
深入浅出Java多线程.pdf
深入浅出Win32多线程程序设计.pdf 讲述多线程编程
线程池是一个容纳多个线程的容器,线程池中的线程可以重复使用,无需反复创建线程而消耗过多的资源 * 使用多线程的好处: 1.降低消耗,减少了创建和销毁线程的次数,每个线程都可以重复利用,可执行多个任务 2.提高...
@1157374899。Tags:多线程线程池。
c++ 多线程线程池 demo
1.委托与多线程2.线程池 Socket 3.聊天程序 模拟IIS 4.一般处理程序 11.异步无刷新分页复习+服务器端控件