线程池怎么保证线程按次序执行任务?

ps:你知道Java有哪些线程池吗?

线程池的分类

我们知道线程池可以分为 newCachedThreadPool、newSingleThreadPool、newFixThreadPool、newScheduleThreadPool、newWorkStealingPool(jdk1.8新增)等5种项目上我们使用的时候还是建议使用ThreadPoolExecutor来构建线程池,至于为什么我们后面在各种线程池的比较文章中详细描述。但是这5种线程池也有独特适用于某种场景的应用

哪种线程池可以按次序执行任务?

根据以上4种线程池的分类,其中只有newSingleThreadPool可以做到按线程的先后次序到达执行,遵循FIFO的队列模式。newSingleThreadPool是只有1个工作线程的线程池,后续进来的线程都会进入Queue等待队列中,当线程池线程空闲的时候先进如等待队列的线程会优先进入工作线程执行任务

源码剖析

查看Executors.newSingleThreadExecutor()源码内部发现其底层依旧是通过ThreadPoolExecutor按特定参数来构建的线程池,具体如下:new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())。线程池最大线程数是1,等待队列是LinkedBlockingQueue无界阻塞队列,这就保证了线程先进先执行的次序

代码示例

结果按线程进入线程池等待队列次序输出

推荐阅读更多精彩内容