中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Java線程池的用法

發布時間:2021-07-09 17:13:27 來源:億速云 閱讀:144 作者:chen 欄目:大數據

這篇文章主要介紹“Java線程池的用法”,在日常操作中,相信很多人在Java線程池的用法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java線程池的用法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

ThreadPoolExecutor

ThreadPoolExecutor是Java線程池中最核心的一個類。

public interface Executor {
    void execute(Runnable command);
}
public interface ExecutorService implements Executor {}
public abstract class AbstractExecutorService implements ExecutorService {}
public class ThreadPoolExecutor extends AbstractExecutorService {
    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.acc = System.getSecurityManager() == null ?
                null :
                AccessController.getContext();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }
}
corePoolSize

核心線程池的大小

maximumPoolSize

線程池允許執行的最大線程數量,當超過這個數量后,任務將存放在workQueue中。

keepAliveTime

當線程池中線程數量大于核心線程池大小時,線程執行完之后就會銷毀掉,直到線程池數量不超過核心線程池大小。

unit

keepAliveTime的單位,常見的有DAYS、HOURS、MINUTES、SECONDS、MILLISECONDS、MICROSECONDS、NANOSECONDS

workQueue

阻塞隊列,用于存儲等待執行的任務。一般有以下幾種選擇

ArrayBlockingQueue

有界隊列,當有新任務到來時 當實際線程數小于corePoolSize時,線程池會生成新的線程執行任務; 當實際線程數大于corePoolSize時,新任務就會加入等待隊列,當等待隊列滿的時候,則會在實際線程不大于maximumPoolSize的前提下創建新線程去處理任務。

LinkedBlockingQueue

無界任務隊列,當有新任務到來時 當實際線程數小于corePoolSize時,線程池會生成新的線程執行任務,當實際線程數大于corePoolSize時,新任務就會加入等待隊列。如果創建速度大于處理速度,則隊列會一直增長,直到耗盡內存。

SynchronousQueue

直接提交的隊列,當有新任務到來時 當實際線程數小于maximumPoolSize時,線程池會生成新的線程執行任務; 當實際線程數大于maximumPoolSize時,新任務就會加入等待隊列,但隊列只會保存最新提交的一個任務。

threadFactory

用來創建線程的工廠

handler

表示拒絕處理任務的策略,有以下取值

ThreadPoolExecutor.AbortPolicy //丟棄任務并拋出RejectedExecutionException異常
ThreadPoolExecutor.DiscardPolicy //也是丟棄任務,但是不拋出異常。 
ThreadPoolExecutor.DiscardOldestPolicy //丟棄隊列最前面的任務,然后重新嘗試執行任務(重復此過程)
ThreadPoolExecutor.CallerRunsPolicy //由調用線程處理該任務

預創建線程池

ExecutorService newCachedThreadPool()
public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(
            0, Integer.MAX_VALUE,
            60L, TimeUnit.SECONDS,
            new SynchronousQueue<Runnable>());
}

無界線程池,最大線程池為Integer的最大值,線程過大時可能導致OOM。

ExecutorService newFixedThreadPool()
public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(
            nThreads, nThreads,
            0L, TimeUnit.MILLISECONDS,
            new LinkedBlockingQueue<Runnable>());
    }

固定大小的線程池。線程數量外部傳入

ExecutorService newSingleThreadExecutor()
public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(
                1, 1,
                0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<Runnable>()));
    }

單一線程池

到此,關于“Java線程池的用法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

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

AI

古丈县| 蓝田县| 华安县| 嘉黎县| 泰顺县| 奉新县| 阜康市| 轮台县| 崇州市| 天门市| 磐安县| 清水县| 大竹县| 泾源县| 岢岚县| 阿图什市| 龙海市| 甘洛县| 曲麻莱县| 彰武县| 尤溪县| 福鼎市| 铜山县| 新邵县| 洛川县| 荃湾区| 贡觉县| 营山县| 沾化县| 嘉祥县| 乌审旗| 太仆寺旗| 台东市| 沈丘县| 诸暨市| 德清县| 麦盖提县| 师宗县| 通州市| 类乌齐县| 包头市|