Java并发之串行线程池实例解析
程序员文章站
2023-01-15 10:37:34
前言
做android的这两年时间,通过研究android源码,也会java并发处理多线程有了自己的一些理解。
那么问题来了,如何实现一个串行的线程池呢?
思路
何...
前言
做android的这两年时间,通过研究android源码,也会java并发处理多线程有了自己的一些理解。
那么问题来了,如何实现一个串行的线程池呢?
思路
何为串行线程池呢?
也就是说,我们的runnable对象应该有个排队的机制,它们顺序从队列尾部进入,并且从队列头部选择runnable进行执行。
既然我们有了思路,那我们就考虑一下所需要的数据结构?
既然是从队列尾部插入runnable对象,从队列头部执行runnable对象,我们自然需要一个队列。java的sdk已经给我们提供了很好的队列数据结构,例如双端队列:arraydeque<runnable>。
- 因为涉及到线程的执行,那我们首先就需要有一个合适的线程池,使用threadpoolexecutor类即可构造。
- 既然是串行执行,那如何保持串行机制呢?我们可以通过try和finally机制,我们将传入的runnable对象重新封装成一个新的runnable对象,在新的runnable的run方法的try块中执行runnable的run方法,在finally中调用执行队列头部runnable对象出队列,并放入线程池执行的方法。
示例代码
import java.util.arraydeque; import java.util.concurrent.blockingqueue; import java.util.concurrent.linkedblockingdeque; import java.util.concurrent.threadfactory; import java.util.concurrent.threadpoolexecutor; import java.util.concurrent.timeunit; import java.util.concurrent.atomic.atomicinteger; /** * created by wzy on 16-1-5. */ public class serialexecutor { private runnable mactive; private arraydeque<runnable> marraydeque = new arraydeque<>(); private static final int cpu_count = runtime.getruntime().availableprocessors(); private static final int core_pool_size = cpu_count + 1; private static final int maximum_pool_size = cpu_count * 2 + 1; private static final int keep_alive = 1; private static final blockingqueue<runnable> spoolworkqueue = new linkedblockingdeque<>(128); private static final threadfactory sthreadfactory = new threadfactory() { private final atomicinteger mcount = new atomicinteger(1); @override public thread newthread(runnable r) { return new thread(r, "serial thread #" + mcount.getandincrement()); } }; private static final threadpoolexecutor thread_executor = new threadpoolexecutor(core_pool_size, maximum_pool_size, keep_alive, timeunit.seconds, spoolworkqueue, sthreadfactory); public synchronized void execute(final runnable r) { marraydeque.offer(new runnable() { @override public void run() { try { r.run(); } finally { schedulenext(); } } }); // 第一次入队列时mactivie为空,因此需要手动调用schedulenext方法 if (mactive == null) { schedulenext(); } } private void schedulenext() { if ((mactive = marraydeque.poll()) != null) { thread_executor.execute(mactive); } } public static void main(string[] args) { serialexecutor serialexecutor = new serialexecutor(); for (int i = 0; i < 10; i ++) { final int j = i; serialexecutor.execute(new runnable() { @override public void run() { system.out.println("the num is :" + (j + 1)); try { thread.sleep(1000); } catch (interruptedexception e) { e.printstacktrace(); } } }); } } }
执行结果如下:
the num is :1
the num is :2
the num is :3
the num is :4
the num is :5
the num is :6
the num is :7
the num is :8
the num is :9
the num is :10
总结
以上就是本文关于java并发之串行线程池实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
推荐阅读
-
Java并发之串行线程池实例解析
-
Java 并发包之线程池和原子计数 ThreadPooljava线程池并发包Java计数
-
并发编程(十三)—— Java 线程池 实现原理与源码深度解析 之 Executors(三)
-
Java并发之线程池ThreadPoolExecutor源码分析学习
-
【Java并发编程】21、线程池ThreadPoolExecutor源码解析
-
Java并发之串行线程池实例解析
-
JAVA 之ThreadPoolExecutor线程池原理及其execute方法实例详解
-
JAVA 之ThreadPoolExecutor线程池原理及其execute方法实例详解
-
死磕 java线程系列之线程池深入解析——普通任务执行流程
-
死磕 java线程系列之线程池深入解析——定时任务执行流程