设计具有相同属性任务串行有序执行的线程池

问题描述

我有一个这样的线程池的场景,相信很多人都遇到过:1,每个用户都可以添加多个任务;2,有很多的用户和很多的任务;3,每个用户添加的任务必须有序串行执行,即在同一时刻不能有同时执行一个用户的两个任务;4,实时性:只要线程池线程有空闲的,那么用户提交任务后必须立即执行;尽可能提高线程的利用率。表示一个用户可以用一个唯一的字符串。我已经开发出了一套基本满足上述要求的线程池,现在抛砖引玉,看看广大网友有没有更好的方案。 问题补充:我写了个论坛主题,并附上我的实现:http://www.iteye.com/topic/1135303

解决方案

简单想想可以这样做:创建一个自定义的等待队列,线程使用PooledExecutor即可:1、所有任务通过等待队列添加,而不是通过线程池的方式添加(线程池有时候不会放到等待队列里面,造成不一致的问题;2、将用户作为一个任务,一个任务包含了用户的多个子任务;3、添加任务,即队列入队操作: 查找用户是否已经存在,如果存在则加到存在的用户任务列表的末尾;4、取出任务执行: 按照策略的方式(这个可能比较重要,最好能设计成为策略的模式)取出一个任务(并不删除,而是将状态置为“执行中”) 执行该任务,执行结束后从队列里面删除(注意是执行完毕再删除,避免并发的情况下造成一个用户的多线程执行)分析: 正确性:由于执行任务的时候将状态置为执行中,执行中的任务不会被再次选中,保证了一个用户任务执行的顺序性; 任务的执行:每次获取的都是可以立即执行的任务,不会造成线程池的等待。 任务的入队:由于需要进行存在性判断,需要进行排序或者使用Hash表辅助,方便 快速定位 公平性:使用策略模式,可能的优先级如下: . 按照用户任务的数量进行排序(积累的任务越多,优先级越高) . 按照用户最早提交的任务等待时间排序(等待时间越长,优先级越高) . 更复杂的排序等
解决方案二:
PriorityBlockingQueue不能满足楼主么?

时间: 2024-10-02 21:17:19

设计具有相同属性任务串行有序执行的线程池的相关文章

WinForm控件开发总结(四) 控件属性的串行化

前一篇文章介绍了常用的设计时Attribute.其中BrowsableAttribute,CategoryAttribute, DescriptionAttribute,DefaultPropertyAttribute,DefaultEventAttribute都是比较简单的,也是可 有可无,但是为了提供更好的用户体验这些Attribute最好不要省掉,如果你对这些Attribute还不熟悉, 可以参考我前一篇文章的描述或者查看MSDN,这里我就不在赘述了. 下来我们主要介绍一下Designer

在JAVA端使Oracle存储过程串行地执行

我们知道给资源上锁可以使我们串行化地访问资源,oracle为plsql开发人员提供了DBMS_SQL包用来管理USERL LOCK锁资源.这种锁可以使得多个session串行的执行某个存储过程,还可以用来排他的访问某个外部设备或服务,甚至可以检测事务的提交或回滚(提交或回滚时锁的释放). 有人说我在java端调用db的存储过程,可以使用synchronized lock来串行的调用存储过程.那就不需要db lock呢?因为当java端应用服务器down的时候,存储过程已经在执行了,但是可能ora

《高性能科学与工程计算》——第2章 串行代码基本优化技术2.1 标量剖析

第2章 串行代码基本优化技术 在千核级并行计算机时代,有些观点认为编写高效串行代码在许多领域已经有些过时了.因为增加更多CPU以获得大规模并行能力要比投入大量精力优化串行代码简单得多.这似乎是一个合理的理论,5.3.8节的论述中也体现了对这种观点的支持.然而,本书认为程序在单处理器上的性能优化毫无疑问是最重要的,如果通过一些简单的优化方法就可以实现两倍加速比,那么用户会更倾向于使用较少的CPU.这样不仅可把宝贵的计算资源释放给其他用户或项目,而且还可以使投入大量资金购买的硬件获得更加有效的利用.

PHP5.0对象模型探索之对象串行化

php5|对象     串行化可以把变量包括对象,转化成连续bytes数据,你可以将串行化后的变量存在一个文件里或在网络上传输,然后再反串行化还原为原来的数据.你在反串行化类的对象之前定义的类,PHP可以成功地存储其对象的属性和方法. 有时你可能需要一个对象在反串行化后立即执行.为了这样的目的,PHP会自动寻找__sleep和__wakeup方法. 当一个对象被串行化,PHP会调用__sleep方法(如果存在的话). 在反串行化一个对象后,PHP 会调用__wakeup方法. 这两个方法都不接受

第十三节--对象串行化 -- Classes and Objects in PHP5 [13]

object|php5|对象 +-------------------------------------------------------------------------------+| = 本文为Haohappy读<<Core PHP Programming>> | = 中Classes and Objects一章的笔记 | = 翻译为主+个人心得 | = 为避免可能发生的不必要的麻烦请勿转载,谢谢 | = 欢迎批评指正,希望和所有PHP爱好者共同进步! +-------

详解PHP对象的串行化与反串行化_php实例

什么时候使用串行化? 在网络中传输对象的时候 向数据库中保存文件的时候 今天我们要提到四个函数 全部串行化 1.serialize(对象名) 将指定的类对象串行化 $str=serialize($per) //将per对象串行化,结果返回给$str 2.unserialize(串行化后的返回值) 返回结果是对象 $per=unserialize($str); 局部串行化 3.__sleep() 串行化某对象的部分属性. 4.__wakeup()反串行化时,初始化(其实是修改)对象内容 前两个的使

说说Android的广播(2) - 并发队列和串行队列

并发队列和串行队列 前面我们讲了,消息分为普通消息和有序消息两大类.普通消息是可以并发的,由于是并发的,这些广播的处理者之间互相是不依赖的. 另外,并发队列和串行队列都各维护了一条后台广播队列和前台广播队列.如果这个消息足够重要,想走快速通道的话,可以选择使用前台广播队列. 对于并发队列,如果是进程活着,动态注册到队列里的,系统会通过并发的方式迅速将消息广播出去,就跟大家所想象的一样. 但是如果需要通过启动新进程才能处理消息的情况,为了避免同时启动大量进程,系统还是采用串行的方式来处理的.后面我

第十三节 对象串行化 [13]_php基础

串行化可以把变量包括对象,转化成连续bytes数据. 你可以将串行化后的变量存在一个文件里或在网络上传输. 然后再反串行化还原为原来的数据. 你在反串行化类的对象之前定义的类,PHP可以成功地存储其对象的属性和方法. 有时你可能需要一个对象在反串行化后立即执行. 为了这样的目的,PHP会自动寻找__sleep和__wakeup方法. 当一个对象被串行化,PHP会调用__sleep方法(如果存在的话). 在反串行化一个对象后,PHP 会调用__wakeup方法. 这两个方法都不接受参数. __sl

第十三节--对象串行化_php基础

/* +-------------------------------------------------------------------------------+ | = 本文为Haohappy读<<Core PHP Programming>>  | = 中Classes and Objects一章的笔记  | = 翻译为主+个人心得  | = 为避免可能发生的不必要的麻烦请勿转载,谢谢  | = 欢迎批评指正,希望和所有PHP爱好者共同进步!  | = PHP5研究中心: