牵手,将军本是草头王,养羊网
做android的这两年时间,通过研究android源码,也会java并发处理多线程有了自己的一些理解。
那么问题来了,如何实现一个串行的线程池呢?
何为串行线程池呢?
也就是说,我们的runnable对象应该有个排队的机制,它们顺序从队列尾部进入,并且从队列头部选择runnable进行执行。
既然我们有了思路,那我们就考虑一下所需要的数据结构?
既然是从队列尾部插入runnable对象,从队列头部执行runnable对象,我们自然需要一个队列。java的sdk已经给我们提供了很好的队列数据结构,例如双端队列:arraydeque<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 8 stream表达式实现if/else逻辑
Java中有界队列的饱和策略(reject policy)原理解析
网友评论