亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java怎么實現手寫線程池并測試

發布時間:2023-02-22 16:30:23 來源:億速云 閱讀:115 作者:iii 欄目:開發技術

本篇內容介紹了“Java怎么實現手寫線程池并測試”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

線程池的核心流程:

Java怎么實現手寫線程池并測試

在線程池核心原理的源碼中,涉及到了一系列的流程,包括線程池隊列數量是否已滿,運用什么樣的拒絕策略等。在我們手寫線程池的代碼中,不需要考慮那么多因素,只需要模擬簡單的情景和過程,因此整體來講還是比較簡單的。

手寫線程池,必不可少的組件有任務隊列,任務的消費者線程池,線程池創建等。我們也可定義構造方法,創建指定大小的線程池線程個數。當然在使用完線程池中的線程后,我們需要考慮將其銷毀或關閉。

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怎么實現手寫線程池并測試

“Java怎么實現手寫線程池并測試”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

信阳市| 寿宁县| 杨浦区| 龙江县| 灵石县| 城口县| 镇宁| 德州市| 金沙县| 克拉玛依市| 昭苏县| 苗栗县| 山阴县| 宽甸| 兴义市| 息烽县| 阳谷县| 莱芜市| 右玉县| 正安县| 云霄县| 青海省| 武宣县| 磐安县| 巴楚县| 舒城县| 平利县| 桦南县| 新宁县| 寻甸| 黄浦区| 洪雅县| 河间市| 溧阳市| 綦江县| 三原县| 铁岭市| 阿鲁科尔沁旗| 上蔡县| 郸城县| 海阳市|