我有一个这样的线程池的场景,相信很多人都遇到过:
1,每个用户都可以添加多个任务;
2,有很多的用户和很多的任务;
3,每个用户添加的任务必须有序串行执行,即在同一时刻不能有同时执行一个用户的两个任务;
4,实时性:只要线程池线程有空闲的,那么用户提交任务后必须立即执行;尽可能提高线程的利用率。
代码比较简洁,基本满足上述要求:
public class SerialThreadExecutor { private Executor executor; private ConcurrentMap<Object, SequentialJob> serialJobs = new ConcurrentHashMap<Object, SequentialJob>(); public SerialThreadExecutor(Executor executor) { super(); this.executor = executor; } public void executeSerially(Object key, Runnable r) { SequentialJob job = serialJobs.get(key); if (job == null) { job = new SequentialJob(key); SequentialJob oldJob = serialJobs.put(key, job); if (oldJob != null) { job = oldJob; } } job.addJob(r); } private class SequentialJob implements Runnable { private BlockingQueue<Runnable> jobs = new LinkedBlockingQueue<Runnable>(); private Object key; private AtomicBoolean running = new AtomicBoolean(false); public SequentialJob(Object key) { this.key = key; } public void run() { Runnable r = null; while (true) { try { r = jobs.poll(50, TimeUnit.MILLISECONDS); if (r != null) { r.run(); } else { synchronized (this) { if (jobs.isEmpty() && running.compareAndSet(true, false)) { return; } else { continue; } } } } catch (InterruptedException e) { // TODO e.printStackTrace(); } } } public void addJob(Runnable r) { synchronized (this) { jobs.add(r); if (running.compareAndSet(false, true)) { executor.execute(this); } } } } }
这个实现有几个缺陷:
1,每次添加一个任务都要进入一次锁,有一点小小开销;
2,serialJobs会一直在内存中,当某个key的任务很久没有添加了,对应的SequentialJob对象一直存在,虽然不占用很多内存,但对于有洁癖的人来说或,还是不爽。
抛砖引玉,看看广大网友是否可以优化。
(异常处理等细节大家就不要理会了)
相关推荐
定时任务quartz实现分组串行并行动态配置
单片机C语言程序设计 2×20串行字符液晶演示(有源码)单片机C语言程序设计 2×20串行字符液晶演示(有源码)单片机C语言程序设计 2×20串行字符液晶演示(有源码)单片机C语言程序设计 2×20串行字符液晶演示(有源码)...
主要介绍了Java并发之串行线程池实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
基于单片机89C51的串行通信发射机设计与实现.doc 基于单片机89C51的串行通信发射机设计与实现.doc 基于单片机89C51的串行通信发射机设计与实现.doc 基于单片机89C51的串行通信发射机设计与实现.doc 基于单片机89C51...
基于51单片机的双机串行通信设计 【摘要】串行通信是单片机的一个重要应用。本次课程设计就是要利用单片机来完成一 个系统,实现双片单片机串行通信。通信的结果实用数码管进行显示,数码管采用查表 方式显示。两个...
串行接口的编程就是要通过程序的方式实现对UART寄存器的读写,并且相应...目前串行接口的程序设计大多采用两种方法,第一种方法是使用Active X控件MSComm;第二种方法是采用Windows API接口。本章分别介绍这两种方法。
串行通信系统设计
基于FPGA的串行通信接口设计,用VHDL语言对硬件进行描述,实现串行通信
基于vhdl的串行扫描显示电路设计,打开工程文件就可实现,并提供下载文件。
最新串行通信接口程序设计,利用C编写,技术文档
使用CGLIB实现并行执行,博客地址:http://blog.csdn.net/yangzl2008/article/details/50489583
嵌入式系统设计与实例开发实验教材二源码\源代码\2.3串行端口程序设计
串行接口SPI接口应用设计,串行接口SPI接口应用设计
单片机C语言程序设计 串行数据转换为并行数据(有源码)单片机C语言程序设计 串行数据转换为并行数据(有源码)单片机C语言程序设计 串行数据转换为并行数据(有源码)单片机C语言程序设计 串行数据转换为并行数据(有...
MATLAB环境下的串行数据通信系统设计,硬件设计采用TL16C550C芯片使设计具有很好可扩展性,用信号处理芯片TMS320VC5416为下位机的实验系统证明该方案进行数据通信与信号处理采集的可靠性。
使用CGLIB实现串行程序的异步并行执行,博客地址:http://blog.csdn.net/yangzl2008/article/details/50489583
单片机C语言程序设计 并行数据转换为串行数据(有源码)单片机C语言程序设计 并行数据转换为串行数据(有源码)单片机C语言程序设计 并行数据转换为串行数据(有源码)单片机C语言程序设计 并行数据转换为串行数据(有...
主要对LabVIEW 的串行通信接口驱动进行了研究.采用虚拟仪器系统标准的API 即VISA进行编程,由于VISA本身不具备编程能力,它是一个高层API,所以通过调用底层驱动程序来实现 对仪器的编程,完成了基于8051单片机的...
串行通信系统设计的课程设计,包含源代码。串行通信系统设计的课程设计,包含源代码。
主要介绍了spring定时任务(scheduler)的串行、并行执行实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下