亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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手寫線程池的資料請關注腳本之家其它相關文章!

相關文章

  • java獲取http請求的Header和Body的簡單方法

    java獲取http請求的Header和Body的簡單方法

    下面小編就為大家?guī)硪黄猨ava獲取http請求的Header和Body的簡單方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • SpringCloud遠程服務調用三種方式及原理

    SpringCloud遠程服務調用三種方式及原理

    本文給大家介紹SpringCloud遠程服務調用實戰(zhàn)筆記,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2022-12-12
  • java使用java.util.Date獲取指定日期的年、月、日、時、分、秒

    java使用java.util.Date獲取指定日期的年、月、日、時、分、秒

    在Java中獲取當前時間和日期是很常見的操作,也是很重要的操作,下面這篇文章主要給大家介紹了關于java使用java.util.Date獲取指定日期的年、月、日、時、分、秒的相關資料,需要的朋友可以參考下
    2024-01-01
  • MybatisPlus代碼生成器的使用方法詳解

    MybatisPlus代碼生成器的使用方法詳解

    在這里我將展示如何自動生成實體類、控制層、服務層、mapper等代碼,這些基礎的代碼全部不需要我們手動創(chuàng)建,由MybatisPlus自動幫我們完成,我們只需要告訴MybatisPlus怎么生成這些代碼就可以了,在此之前我們需要配置好測試的環(huán)境,數(shù)據庫和表數(shù)據 ,需要的朋友可以參考下
    2021-06-06
  • springboot的Customizer源碼解析

    springboot的Customizer源碼解析

    這篇文章主要為大家介紹了springboot的Customizer源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • 詳解Java?ReentrantLock可重入,可打斷,鎖超時的實現(xiàn)原理

    詳解Java?ReentrantLock可重入,可打斷,鎖超時的實現(xiàn)原理

    前面講解了ReentrantLock加鎖和解鎖的原理實現(xiàn),但是沒有闡述它的可重入、可打斷以及超時獲取鎖失敗的原理,本文就重點講解這三種情況,需要的可以了解一下
    2022-10-10
  • RxJava的消息發(fā)送和線程切換實現(xiàn)原理

    RxJava的消息發(fā)送和線程切換實現(xiàn)原理

    這篇文章主要介紹了RxJava的消息發(fā)送和線程切換實現(xiàn)原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • java實現(xiàn)面板之間切換功能

    java實現(xiàn)面板之間切換功能

    這篇文章主要為大家詳細介紹了java實現(xiàn)面板之間切換功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Spring Boot攔截器和過濾器實例解析

    Spring Boot攔截器和過濾器實例解析

    這篇文章主要介紹了Spring Boot攔截器和過濾器實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • Java源碼解析之詳解ReentrantLock

    Java源碼解析之詳解ReentrantLock

    今天給大家?guī)淼氖顷P于Java并發(fā)的相關知識,文章圍繞著ReentrantLock源碼展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06

最新評論