最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實現(xiàn)手寫線程池實例并測試詳解

 更新時間:2023年02月22日 15:08:46   作者:小威要向諸佬學習呀  
這篇文章主要來模擬一下線程池和工作隊列的流程,以及編寫代碼和測試類進行測試。文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下

前言

在之前的文章中介紹過線程池的核心原理,在一次面試中面試官讓手寫線程池,這塊知識忘記的差不多了,因此本篇文章做一個回顧。

希望能夠加深自己的印象以及幫助到其他的小伙伴兒們

在線程池核心原理篇介紹過線程池的核心原理,今天來模擬線程池和工作隊列的流程,以及編寫代碼和測試類進行測試。下面附下之前線程池的核心流程:

在線程池核心原理的源碼中,涉及到了一系列的流程,包括線程池隊列數(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手寫線程池的資料請關注腳本之家其它相關文章!

相關文章

  • RestTemplate上傳、下載文件實例代碼

    RestTemplate上傳、下載文件實例代碼

    介紹了文件上傳和下載的基本方法,包括處理本地文件和文件流,上傳時區(qū)分了文件是否在本地,下載時強調返回值為byte[],并提供了工具類進行進一步處理
    2025-02-02
  • 在Java中將jsonObject轉換成對象的實現(xiàn)方法

    在Java中將jsonObject轉換成對象的實現(xiàn)方法

    在現(xiàn)代的Web開發(fā)中,JSON作為一種輕量級的數(shù)據(jù)交換格式,因其易讀性和易于解析的特點而被廣泛使用,本文將介紹如何在Java中將??jsonObject??轉換成Java對象,主要通過使用Gson庫來實現(xiàn)這一功能,需要的朋友可以參考下
    2025-04-04
  • 新手了解java 集合基礎知識

    新手了解java 集合基礎知識

    今天小編就為大家分享一篇關于Java集合總結,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧,希望對你有所幫助
    2021-07-07
  • java實現(xiàn)乘地鐵方案的最優(yōu)選擇(票價,距離)

    java實現(xiàn)乘地鐵方案的最優(yōu)選擇(票價,距離)

    這篇文章主要介紹了java實現(xiàn)乘地鐵方案的最優(yōu)選擇(票價,距離),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • Java8?Optional常用方法使用場景分析

    Java8?Optional常用方法使用場景分析

    這篇文章主要介紹了Java8?Optional常用方法使用場景,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Java模板動態(tài)生成word文件的方法步驟

    Java模板動態(tài)生成word文件的方法步驟

    最近項目中需要根據(jù)模板生成word文檔,模板文件也是word文檔。本文使用使用freemarker模板生成word文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Spring中XmlWebApplicationContext的實現(xiàn)

    Spring中XmlWebApplicationContext的實現(xiàn)

    XmlWebApplicationContext是Spring?Framework中的一個重要類,本文主要介紹了Spring中XmlWebApplicationContext,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • Java基礎學習之接口詳解

    Java基礎學習之接口詳解

    接口,是Java語言中一種引用類型,是方法的集合,如果說類的內部封裝了成員變量、構造方法和成員方法,那么接口的內部主要就是封裝了方法。本文通過一些示例詳細為大家展示了接口的使用,需要的可以參考一下
    2022-10-10
  • Java中map內部存儲方式解析

    Java中map內部存儲方式解析

    這篇文章主要介紹了Java中map內部存儲方式解析的相關內容,涉及其實現(xiàn)方式,以及對存儲方式作了簡單的比較,具有一定參考價值,需要的朋友可了解下。
    2017-10-10
  • 淺談myBatis中的插件機制

    淺談myBatis中的插件機制

    這篇文章主要介紹了淺談myBatis中的插件機制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11

最新評論

达州市| 牙克石市| 塔城市| 进贤县| 平罗县| 柘城县| 昌江| 开原市| 石阡县| 泾阳县| 上虞市| 鹰潭市| 鄂托克前旗| 德保县| 绿春县| 新津县| 崇仁县| 偃师市| 舞钢市| 石家庄市| 桂东县| 兰西县| 定襄县| 内江市| 阜南县| 兴和县| 宁强县| 泌阳县| 明星| 东兰县| 徐汇区| 澄江县| 博兴县| 河西区| 牟定县| 抚顺市| 长丰县| 双江| 闸北区| 广元市| 沈阳市|