Java實現(xiàn)手寫線程池實例并測試詳解
前言
在之前的文章中介紹過線程池的核心原理,在一次面試中面試官讓手寫線程池,這塊知識忘記的差不多了,因此本篇文章做一個回顧。
希望能夠加深自己的印象以及幫助到其他的小伙伴兒們
在線程池核心原理篇介紹過線程池的核心原理,今天來模擬線程池和工作隊列的流程,以及編寫代碼和測試類進行測試。下面附下之前線程池的核心流程:
在線程池核心原理的源碼中,涉及到了一系列的流程,包括線程池隊列數(shù)量是否已滿,運用什么樣的拒絕策略等。在我們手寫線程池的代碼中,不需要考慮那么多因素,只需要模擬簡單的情景和過程,因此整體來講還是比較簡單的。
手寫線程池,必不可少的組件有任務隊列,任務的消費者線程池,線程池創(chuàng)建等。我們也可定義構造方法,創(chuàng)建指定大小的線程池線程個數(shù)。當然在使用完線程池中的線程后,我們需要考慮將其銷毀或關閉。
相關代碼和解釋如下:
package XIAOWEI; import java.util.ArrayList; import java.util.List; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.stream.IntStream; public class ThreadPool { private static final int WorkQueueSIZE = 5; private BlockingQueue<Runnable> workQueue; private List<WorkThread> workThreads=new ArrayList<WorkThread>(); /** * @author xiaowei * @param poolSize * @param workQueue * 構造方法,傳線程池的大小和阻塞隊列 */ public ThreadPool(int poolSize,BlockingQueue<Runnable> workQueue) { this.workQueue = workQueue; IntStream.range(0,poolSize).forEach((i)->{ WorkThread workThread=new WorkThread(); workThread.start(); workThreads.add(workThread); }); } /** * @param poolSize * 在ThreadPool的構造方法中傳入線程池的大小 */ public ThreadPool(int poolSize){ this(poolSize,new LinkedBlockingQueue<>(WorkQueueSIZE)); } /** * @param task * 通過線程池執(zhí)行任務 */ public void extcute(Runnable task){ try { workQueue.put(task); } catch (InterruptedException e) { e.printStackTrace(); } } public void shutdown(){ if(workThreads!=null && workThreads.size()>0){ workThreads.stream().forEach((workThread) -> { workThread.interrupt(); }); } } /** * 內部類 源源不斷的消耗workQueue中的任務 */ class WorkThread extends Thread { @Override public void run() { Thread currentThread = Thread.currentThread(); // 死循環(huán) 不斷一直消費隊列中的任務 直到任務被消費完全 while (true) { try { if (currentThread.isInterrupted()) { break; } Runnable workTasK = workQueue.take(); workTasK.run(); } catch (InterruptedException e) { currentThread.interrupt(); } } } } }
相關測試代碼如下:
package XIAOWEI; import java.util.stream.IntStream; public class ThreadPoolTest { public static void main(String[] args) { ThreadPool threadPool = new ThreadPool(5); IntStream.range(0,10).forEach((i)->{ threadPool.extcute(()->{ System.out.println(Thread.currentThread().getName()+"2023一起加油"); }); }); threadPool.shutdown(); } }
一共在線程池中加入了五個線程和十個任務,因此每個線程會執(zhí)行兩個任務。
測試結果如下圖所示:
以上就是Java實現(xiàn)手寫線程池實例并測試詳解的詳細內容,更多關于Java手寫線程池的資料請關注腳本之家其它相關文章!
相關文章
java使用java.util.Date獲取指定日期的年、月、日、時、分、秒
在Java中獲取當前時間和日期是很常見的操作,也是很重要的操作,下面這篇文章主要給大家介紹了關于java使用java.util.Date獲取指定日期的年、月、日、時、分、秒的相關資料,需要的朋友可以參考下2024-01-01詳解Java?ReentrantLock可重入,可打斷,鎖超時的實現(xiàn)原理
前面講解了ReentrantLock加鎖和解鎖的原理實現(xiàn),但是沒有闡述它的可重入、可打斷以及超時獲取鎖失敗的原理,本文就重點講解這三種情況,需要的可以了解一下2022-10-10RxJava的消息發(fā)送和線程切換實現(xiàn)原理
這篇文章主要介紹了RxJava的消息發(fā)送和線程切換實現(xiàn)原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11