您好,登錄后才能下訂單哦!
本篇內容介紹了“Java怎么實現手寫線程池并測試”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
線程池的核心流程:
在線程池核心原理的源碼中,涉及到了一系列的流程,包括線程池隊列數量是否已滿,運用什么樣的拒絕策略等。在我們手寫線程池的代碼中,不需要考慮那么多因素,只需要模擬簡單的情景和過程,因此整體來講還是比較簡單的。
手寫線程池,必不可少的組件有任務隊列,任務的消費者線程池,線程池創建等。我們也可定義構造方法,創建指定大小的線程池線程個數。當然在使用完線程池中的線程后,我們需要考慮將其銷毀或關閉。
相關代碼和解釋如下:
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 * 通過線程池執行任務 */ 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(); // 死循環 不斷一直消費隊列中的任務 直到任務被消費完全 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(); } }
一共在線程池中加入了五個線程和十個任務,因此每個線程會執行兩個任務。
測試結果如下圖所示:
“Java怎么實現手寫線程池并測試”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。