-
设计具有相同属性任务串行有序执行的线程池10
我有一个这样的线程池的场景,相信很多人都遇到过:
1,每个用户都可以添加多个任务;
2,有很多的用户和很多的任务;
3,每个用户添加的任务必须有序串行执行,即在同一时刻不能有同时执行一个用户的两个任务;
4,实时性:只要线程池线程有空闲的,那么用户提交任务后必须立即执行;尽可能提高线程的利用率。
表示一个用户可以用一个唯一的字符串。
我已经开发出了一套基本满足上述要求的线程池,现在抛砖引玉,看看广大网友有没有更好的方案。
问题补充:我写了个论坛主题,并附上我的实现:http://www.iteye.com/topic/11353032014年9月03日 10:22
2个答案 按时间排序 按投票排序
-
采纳的答案
简单想想可以这样做:
创建一个自定义的等待队列,线程使用PooledExecutor即可:
1、所有任务通过等待队列添加,而不是通过线程池的方式添加(线程池有时候不会放到等待队列里面,造成不一致的问题;
2、将用户作为一个任务,一个任务包含了用户的多个子任务;
3、添加任务,即队列入队操作:
查找用户是否已经存在,如果存在则加到存在的用户任务列表的末尾;
4、取出任务执行:
按照策略的方式(这个可能比较重要,最好能设计成为策略的模式)取出一个任务(并不删除,而是将状态置为“执行中”)
执行该任务,执行结束后从队列里面删除(注意是执行完毕再删除,避免并发的情况下造成一个用户的多线程执行)
分析:
正确性:由于执行任务的时候将状态置为执行中,执行中的任务不会被再次选中,保证了一个用户任务执行的顺序性;
任务的执行:每次获取的都是可以立即执行的任务,不会造成线程池的等待。
任务的入队:由于需要进行存在性判断,需要进行排序或者使用Hash表辅助,方便 快速定位
公平性:使用策略模式,可能的优先级如下:
. 按照用户任务的数量进行排序(积累的任务越多,优先级越高)
. 按照用户最早提交的任务等待时间排序(等待时间越长,优先级越高)
. 更复杂的排序等2014年9月03日 15:02
相关推荐
当异步执行的任务需要保证顺序性时,可以使用线程锁来保证任务的串行执行。通过在线程池中初始化一个线程锁对象,确保当一个任务在执行时,其他任务需要等待,直到锁被释放。这种机制可以用于防止对共享资源的竞争...
在实际应用中,我们可能需要根据业务需求动态地配置定时任务的执行方式,例如,某些任务可能需要串行执行,而其他任务则可以并行处理。本篇文章将深入探讨如何利用Quartz实现定时任务的分组、串行和并行动态配置。 ...
1. newSingleThreadExecutor():创建一个单线程的线程池,保证任务按提交顺序串行执行。 2. newFixedThreadPool(int nThreads):创建一个固定大小的线程池,池中维护着指定数量的工作线程,一旦工作线程因执行任务...
串行线程池是指一个线程池中只有一个线程在执行任务,其他线程在队列中等待执行。这和并发线程池不同,后者可以同时执行多个线程。 为了实现一个串行的线程池,我们需要使用Java提供的ThreadPoolExecutor类。...
- `newSingleThreadExecutor()`:创建单线程的线程池,所有任务在线程池中串行执行。 示例: ```java ExecutorService executorService = Executors.newFixedThreadPool(3); for (int i = 0; i ; i++) { ...
这个主题主要涉及如何将原本设计为并行运行的任务转换为串行执行,以适应某些特定场景的需求或解决特定问题。CGLIB(Code Generation Library)是一个在Java平台上的动态代理库,它被广泛用于AOP(面向切面编程)和...
3. **SingleThreadExecutor**: `Executors.newSingleThreadExecutor()`创建一个只有一个线程的线程池,所有任务都会按照提交的顺序串行执行。这个线程池适用于需要保证执行顺序的场景,比如日志记录或者数据库事务。...
这种线程池设计在很多场景下都非常有用,例如,当需要控制某个资源被串行访问时,或者当需要定时执行某些任务时。通过限制每个时间间隔内只有一个任务运行,开发者可以避免资源竞争和竞态条件,保证线程安全。同时,...
单线程的线程池是指只有一个线程在工作的线程池,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。 ...
单片机C语言程序设计 2×20串行字符液晶演示(有源码)单片机C语言程序设计 2×20串行字符液晶演示(有源码)单片机C语言程序设计 2×20串行字符液晶演示(有源码)单片机C语言程序设计 2×20串行字符液晶演示(有源码)...
单片机C语言程序设计 并行数据转换为串行数据(有源码)单片机C语言程序设计 并行数据转换为串行数据(有源码)单片机C语言程序设计 并行数据转换为串行数据(有源码)单片机C语言程序设计 并行数据转换为串行数据(有...
- 特点:只有一个工作线程,确保所有任务按顺序执行,任务之间具有串行化特性。 - 优点:保证任务执行的顺序性,适用于需要保持任务执行顺序的场景。 - 缺点:并发处理能力弱,只适用于轻量级任务,且无法利用...
串行任务系统: 顺序执行任务,不支持并行执行。 并行任务系统(Spawn): 使用新线程并行执行任务,但每次调用run()都会创建新线程。 并行任务系统(线程池轮询): 使用线程池执行任务,没有任务时线程会轮询等待...
通过将原本顺序执行的任务分解为多个子任务,然后并发地执行这些子任务,可以显著提高程序运行效率。CGLIB(Code Generation Library)作为一款强大的Java字节码操作库,常常被用来实现这一目标。 CGLIB是一个高...
2. 单线程池:`Executors.newSingleThreadExecutor()`,只有一个线程,任务按顺序执行,确保任务间的串行化。 3. 定时线程池:`Executors.newScheduledThreadPool(int corePoolSize)`,支持定时及周期性任务,可用于...
1. 同步批量任务启动实现类似ISPC任务启动的功能,通过run()方法同步执行指定数量的任务实例,提供串行和多种并行实现,包括始终创建新线程、使用旋转的线程池和使用睡眠的线程池等不同策略。 2. 异步任务图执行支持...
### 串行任务系统(TaskSystemSerial) 顺序执行任务,每次执行一个任务,直到所有任务完成。 ### 并行任务系统(TaskSystemParallelSpawn) 使用spawn方式创建线程池,并行执行任务。 每个线程执行一段任务,...
Spring定时任务(Scheduler)的串行、并行执行实现解析 Spring Framework提供了一个强大的任务调度器(Scheduler),可以用于实现各种类型的定时任务。其中,串行执行和并行执行是两种常见的任务执行模式。本文将...
单片机C语言程序设计 开关控制12864LCD串行模式显示(有源码)单片机C语言程序设计 开关控制12864LCD串行模式显示(有源码)单片机C语言程序设计 开关控制12864LCD串行模式显示(有源码)单片机C语言程序设计 开关控制...
- `newSingleThreadExecutor()`:创建一个单线程的线程池,所有的任务都会被串行执行。 - `newScheduledThreadPool(int corePoolSize)`:创建一个定长线程池,支持定时及周期性任务执行。 使用ExecutorService时,...