深入浅出多线程(5)以并行包线程池为例说说线程池的设计需求及使用

接深入浅出多线程系列4,

线程对象的创建和销毁是需要花费系统资源的,通过线程池,可以避免该问 题并提高系统的响应时间。这种情形类似我们常提到的数据库连接池。

线程池的广泛应用使得在SUN在JDK 1.5的工具包提供了线程池的支持。我计 划将该系列分为设计需求与设计实现两个部分。这样会更加清晰。如果想要熟悉 ,并熟练应用线程池,那么通过设计需求篇也就是该篇就可以找到答案。如果想 探究实现的细节,那么在设计实现篇会有深入的说明。

本文以Concurrent包线程池设计为例,讨论线程池的设计。

线程池需求

设计与实现的最终目标是满足需求,这是软件开发的基本原则。我们先考虑 考虑对线程池的需求。作为一名开发人员,我们最主要的需求就是线程池简单, 易用。即使你的设计算法多么优雅,但给使用者复杂的使用步骤也是得不偿失, 简单就是美!最好我们不用深究你的具体实现,通过简单的接口就可以应用。其 次就是技术角度,线程池的设计应该是比较柔性的,提供很好的可配置可管理与 可扩张性。

对于可配置可管理的需求,至少的提供以下的功能点:

线程池里,线程数量的配置。

能够提供动态调整线程的数量。

能够Shutdown 最好能够提供优雅的Shundown,而不是像我们通过切断电源关 闭机器那样粗暴的Shutdown。

能够提供Task的状态,比如完成了多少,还有多少没有完成。

对于可扩展性而言有以下几点:

如果不能满足需要能够很容易的扩展。

对于线程池线程的创建能否提够扩展。

当提交的Task负载过大时,线程池的处理策略能否扩展。

以上是对线程池的需求的讨论。

时间: 2024-11-03 18:40:24

深入浅出多线程(5)以并行包线程池为例说说线程池的设计需求及使用的相关文章

深入浅出多线程(3)-Future异步模式以及在JDK1.5Concurrent包中的实现

接深入浅出多线程(2)在多线程交互的中,经常有一个线程需要得到另个一 线程的计算结果,我们常用的是Future异步模式来加以解决. 什么是Future模式呢?Future 顾名思义,在金融行业叫期权,市场上有看跌 期权和看涨期权,你可以在现在(比如九月份)购买年底(十二月)的石油,假 如你买的是看涨期权,那么如果石油真的涨了,你也可以在十二月份依照九月份 商定的价格购买.扯远了,Future就是你可以拿到未来的结果.对于多线程,如 果线程A要等待线程B的结果,那么线程A没必要等待B,直到B有结果

C#线程系列讲座(3):线程池和文件下载服务器

如果设计一个服务器程序,每当处理用户请求时,都开始一个线程,将会在一 定程序上消耗服务器的资源.为此,一个最好的解决方法就是在服务器启动之前 ,事先创建一些线程对象,然后,当处理客户端请求时,就从这些建好的线程中 获得线程对象,并处理请求.保存这些线程对象的结构就叫做线程池. 在C#中可以通过System.Threading.ThreadPool类来实现,在默认情况下, ThreadPool最大可建立500个工作线程和1000个I/O线程(根据机器CPU个数和.net framework版本的不

java线程池当其中一个线程算出结果,终止全部线程

问题描述 java线程池当其中一个线程算出结果,终止全部线程 业务逻辑: 一个大型社区,每一秒有上千人在提交留言,提交的留言将经过,上万条的正则表达式的过滤,没有匹配任何规则的,才保存到系统,否则提示用户,您录入的内容不合法. 我是这样想的,把这上万条正则表达式,拆分成2000条一组,开一个5个线程的线程池,每个线程将负责其中2000个规则的匹配. 每条留言提交时,将由这5个线程,去判断是否有匹配的规则,如果其中一个线程匹配到了规则,将结束其他4个线程的任务,返回给用户结果. 请问这种要怎么实现

mfc循环创建的多线程A去调用了另外一个线程B,其中A线程出问题要退出。

问题描述 mfc循环创建的多线程A去调用了另外一个线程B,其中A线程出问题要退出. mfc循环创建的多线程A去调用了另外一个线程B,其中A的一个线程出问题要退出.B线程怎么也终止了 怎么办?用的是下面这个. // 资源释放结束,可退出线程并析构类 pMg->m_ExitThread.SetEvent();

银行取款[多线程]{使用volatile修饰共享变量,但此场景并不保证线程同步}

经典例子:老婆(朱丽叶)老公(罗密欧),使用银行卡和存折,或者网银等,同时对同一账户操作的安全问题. 此处用多线程实现,同时取款的模拟实现,使用volatile修饰共享变量,但此场景并不保证线程同步,查看取款安全隐患问题,代码如下: 我学习地址(Thanks for auther): Java 理论与实践: 正确使用 Volatile 变量 java中volatile关键字的含义 ----------------------------------------------------------

关于多线程编程您不知道的 5 件事 有关高性能线程处理的微妙之处

虽然很少有 Java 开发人员能够忽视多线程编程和支持它的 Java 平台库,更少有人有时间深入研究线程.相反地,我们临时学习线程,在需要时向我们的工具箱添加新的技巧和技术.以这种方式构建和运行适当的应用程序是可行的,但是您可以做的不止这些.理解 Java 编译器的线程处理特性和 JVM 将有助于您编写更高效.性能更好的 Java 代码. 在这期的 5 件事 系列 中,我将通过同步方法.volatile 变量和原子类介绍多线程编程的一些更隐晦的方面.我的讨论特别关注于这些构建如何与 JVM 和

asp.net 多线程(多个task) 问题,一般开多少个线程合适

问题描述 asp.net 多线程(多个task) 问题,一般开多少个线程合适 开多个线程 是否跟CPU有关? 我本机开60个线程看起来没有起多大作用,这是怎么回事 求大神解答 解决方案 如果每个task都一直运行不挂起,那几个CPU开几个线程,一般比较高效,除非有其他的资源竞争..如果60个线程全都在挂起等待状态,那开再多也没有用.. 解决方案二: 求大神回复,现在用创建60个task,每个task处理数据,发现效率不高

boost中asio网络库多线程并发处理实现,以及asio在多线程模型中线程的调度情况和线程安全。

1.实现多线程方法: 其实就是多个线程同时调用io_service::run         for (int i = 0; i != m_nThreads; ++i)        {            boost::shared_ptr<boost::thread> pTh(new boost::thread(                boost::bind(&boost::asio::io_service::run,&m_ioService)));       

多线程-疑问:线程启动之后再设置线程的优先级别,逻辑上是不是有问题?

问题描述 疑问:线程启动之后再设置线程的优先级别,逻辑上是不是有问题? 正在学习多线程,有这样一个疑问:线程启动之后再设置线程的优先级别,逻辑上是不是有问题?求助大神们解答下. 解决方案 没啥问题,相当于动态调整线程优先级.因为线程优先级是影响CPU调度优先级,你修改了,就可以影响下一次CPU的选择.所以可以启动再修改. 解决方案二: 没有问题,但是要注意,如果你启动的时候创建的是实时优先级,那么可能更改优先级的代码得不到及时执行. 解决方案三: 现代操作系统都是多任务抢占式操作系统,系统会随时