溫馨提示×

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

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

Java線(xiàn)程池的使用方法

發(fā)布時(shí)間:2021-07-06 18:46:05 來(lái)源:億速云 閱讀:160 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“Java線(xiàn)程池的使用方法”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Java線(xiàn)程池的使用方法”吧!

在任務(wù)與執(zhí)行策略之間的隱形耦合

依賴(lài)任務(wù)

使用線(xiàn)程封閉機(jī)制的任務(wù)

對(duì)相應(yīng)時(shí)間敏感的任務(wù)

使用ThreadLocal的任務(wù)

在線(xiàn)程池中,如果任務(wù)依賴(lài)于其他任務(wù),那么可能產(chǎn)生死鎖。

程序清單8-1 在單線(xiàn)程中任務(wù)發(fā)生死鎖

public class ThreadDeadLock {

    Executor executor = Executors.newSingleThreadExecutor();

    public class RenderPageTask implements Callable<String> {
        @Override
        public String call() throws Exception {
            Future<String> header, footer;
            header = executor.execute(new LoadFileTask("header.html"));
            footer = executor.execute(new LoadFileTask("footer.html"));
            
            String page = renderBody();
            //將發(fā)生死鎖 -- 由于任務(wù)在等待子任務(wù)的結(jié)果
            return header.get() + page + footer.get();
        }
    }
}

每當(dāng)提交一個(gè)有依賴(lài)性的Executor任務(wù)時(shí),要清楚地知道可能會(huì)出現(xiàn)線(xiàn)程"饑餓"死鎖,因此需要在代碼或配置Executor的配置文件中記錄線(xiàn)程池的大小限制或配置限制。

 除了在線(xiàn)程池大小上的顯示限制外,還可能由于其他資源上的約束而存在一些隱式限制。如果應(yīng)用程序使用一個(gè)包含10個(gè)連接的JDBC連接池,并且每個(gè)任務(wù)需要一個(gè)數(shù)據(jù)庫(kù)連接,那么線(xiàn)程池就好像只有10個(gè)線(xiàn)程,因?yàn)楫?dāng)超過(guò)10個(gè)任務(wù)時(shí),新的任務(wù)需要等待其他任務(wù)釋放連接。

運(yùn)行時(shí)間較長(zhǎng)的任務(wù)

設(shè)置線(xiàn)程池的大小

配置ThreadPoolExecutor

ThreadPoolExecutor是線(xiàn)程池的真正實(shí)現(xiàn),它構(gòu)造方法提供了一系列參數(shù)來(lái)配置線(xiàn)程池。

public ThreadPoolExecutor (int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) {...}

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHander hander) {...}

corePoolSize--線(xiàn)程池的核心線(xiàn)程數(shù),默認(rèn)情況下,核心線(xiàn)程會(huì)在線(xiàn)程池中一直存活,即使他們處于限制狀態(tài)。如果將ThreadPoolExecutor的allowCoreThreadTimeOut屬性

設(shè)置為true,那么閑置的線(xiàn)程核心線(xiàn)程在等待新任務(wù)到來(lái)時(shí)會(huì)有超時(shí)策略,這個(gè)時(shí)間間隔由keepAliveTime所指定,當(dāng)?shù)却龝r(shí)間超出keepAliveTime所指定的時(shí)長(zhǎng)后,核心線(xiàn)程就會(huì)被終止。

maximumPoolSize--線(xiàn)程池所能容納的最大線(xiàn)程數(shù),當(dāng)活動(dòng)線(xiàn)程數(shù)達(dá)到這個(gè)數(shù)值后,后續(xù)的新任務(wù)將會(huì)被阻塞。

keepAliveTime--非核心線(xiàn)程閑置的超時(shí)時(shí)長(zhǎng),超過(guò)這個(gè)時(shí)長(zhǎng),非核心線(xiàn)程就會(huì)被回收。當(dāng)ThreadPoolExecutor的屬性allowCoreThreadTimeOut值為true時(shí),keepAliveTime也作用于核心現(xiàn)程。

unit--用于指定keepAliveTime時(shí)間參數(shù)的單位,這是一個(gè)枚舉,常用的有TimeOut.MILLISECONDS(毫秒)、TimeOut.SECONDS(秒)以及TimeOut.MINUTES(分鐘)等。

workQueue--線(xiàn)程池中的任務(wù)隊(duì)列,通過(guò)線(xiàn)程池的executor方法提交的Runnable對(duì)象會(huì)存儲(chǔ)在這個(gè)參數(shù)中。

threadFactory--線(xiàn)程工廠,為線(xiàn)程池提供創(chuàng)建新線(xiàn)程的功能。ThreadFactory是一個(gè)接口,它只有一個(gè)方法:Thread newThread(Runnable r);

hander--不常用就不做介紹了。

ThreadPoolExecutor執(zhí)行任務(wù)時(shí)大致遵循如下規(guī)則:

1 如果線(xiàn)程池中的線(xiàn)程數(shù)未達(dá)到核心數(shù)量,那么會(huì)直接啟動(dòng)一個(gè)核心線(xiàn)程來(lái)執(zhí)行任務(wù)。

2 如果線(xiàn)程池中的線(xiàn)程數(shù)已達(dá)到或者超過(guò)核心數(shù)量,那么任務(wù)會(huì)被插入到任務(wù)隊(duì)列中排隊(duì)等待執(zhí)行。

3 如果在步驟2中無(wú)法將任務(wù)插入到任務(wù)隊(duì)列中,這往往是由于任務(wù)隊(duì)列已滿(mǎn),這個(gè)時(shí)候如果線(xiàn)程數(shù)量未達(dá)到線(xiàn)程規(guī)定的最大值,那么會(huì)立刻啟動(dòng)一個(gè)非核心線(xiàn)程來(lái)執(zhí)行任務(wù)。

4 如果步驟3中線(xiàn)程數(shù)量已經(jīng)達(dá)到線(xiàn)程池規(guī)定的最大值,那么就拒絕執(zhí)行任務(wù),ThreadPoolExecutor會(huì)調(diào)用RejectedExecutionHander的rejectedExecution方法來(lái)通知調(diào)用者。

到此,相信大家對(duì)“Java線(xiàn)程池的使用方法”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(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