溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java線程池的用法

發(fā)布時(shí)間:2021-07-09 17:13:27 來源:億速云 閱讀:143 作者:chen 欄目:大數(shù)據(jù)

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

ThreadPoolExecutor

ThreadPoolExecutor是Java線程池中最核心的一個(gè)類。

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

線程池允許執(zhí)行的最大線程數(shù)量,當(dāng)超過這個(gè)數(shù)量后,任務(wù)將存放在workQueue中。

keepAliveTime

當(dāng)線程池中線程數(shù)量大于核心線程池大小時(shí),線程執(zhí)行完之后就會(huì)銷毀掉,直到線程池?cái)?shù)量不超過核心線程池大小。

unit

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

workQueue

阻塞隊(duì)列,用于存儲(chǔ)等待執(zhí)行的任務(wù)。一般有以下幾種選擇

ArrayBlockingQueue

有界隊(duì)列,當(dāng)有新任務(wù)到來時(shí) 當(dāng)實(shí)際線程數(shù)小于corePoolSize時(shí),線程池會(huì)生成新的線程執(zhí)行任務(wù); 當(dāng)實(shí)際線程數(shù)大于corePoolSize時(shí),新任務(wù)就會(huì)加入等待隊(duì)列,當(dāng)?shù)却?duì)列滿的時(shí)候,則會(huì)在實(shí)際線程不大于maximumPoolSize的前提下創(chuàng)建新線程去處理任務(wù)。

LinkedBlockingQueue

無界任務(wù)隊(duì)列,當(dāng)有新任務(wù)到來時(shí) 當(dāng)實(shí)際線程數(shù)小于corePoolSize時(shí),線程池會(huì)生成新的線程執(zhí)行任務(wù),當(dāng)實(shí)際線程數(shù)大于corePoolSize時(shí),新任務(wù)就會(huì)加入等待隊(duì)列。如果創(chuàng)建速度大于處理速度,則隊(duì)列會(huì)一直增長(zhǎng),直到耗盡內(nèi)存。

SynchronousQueue

直接提交的隊(duì)列,當(dāng)有新任務(wù)到來時(shí) 當(dāng)實(shí)際線程數(shù)小于maximumPoolSize時(shí),線程池會(huì)生成新的線程執(zhí)行任務(wù); 當(dāng)實(shí)際線程數(shù)大于maximumPoolSize時(shí),新任務(wù)就會(huì)加入等待隊(duì)列,但隊(duì)列只會(huì)保存最新提交的一個(gè)任務(wù)。

threadFactory

用來創(chuàng)建線程的工廠

handler

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

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

預(yù)創(chuàng)建線程池

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

無界線程池,最大線程池為Integer的最大值,線程過大時(shí)可能導(dǎo)致OOM。

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

固定大小的線程池。線程數(shù)量外部傳入

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

單一線程池

到此,關(guān)于“Java線程池的用法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI