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

溫馨提示×

溫馨提示×

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

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

Java線程池的使用方法

發布時間:2021-07-06 18:46:05 來源:億速云 閱讀:160 作者:chen 欄目:大數據

本篇內容主要講解“Java線程池的使用方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java線程池的使用方法”吧!

在任務與執行策略之間的隱形耦合

依賴任務

使用線程封閉機制的任務

對相應時間敏感的任務

使用ThreadLocal的任務

在線程池中,如果任務依賴于其他任務,那么可能產生死鎖。

程序清單8-1 在單線程中任務發生死鎖

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();
            //將發生死鎖 -- 由于任務在等待子任務的結果
            return header.get() + page + footer.get();
        }
    }
}

每當提交一個有依賴性的Executor任務時,要清楚地知道可能會出現線程"饑餓"死鎖,因此需要在代碼或配置Executor的配置文件中記錄線程池的大小限制或配置限制。

 除了在線程池大小上的顯示限制外,還可能由于其他資源上的約束而存在一些隱式限制。如果應用程序使用一個包含10個連接的JDBC連接池,并且每個任務需要一個數據庫連接,那么線程池就好像只有10個線程,因為當超過10個任務時,新的任務需要等待其他任務釋放連接。

運行時間較長的任務

設置線程池的大小

配置ThreadPoolExecutor

ThreadPoolExecutor是線程池的真正實現,它構造方法提供了一系列參數來配置線程池。

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--線程池的核心線程數,默認情況下,核心線程會在線程池中一直存活,即使他們處于限制狀態。如果將ThreadPoolExecutor的allowCoreThreadTimeOut屬性

設置為true,那么閑置的線程核心線程在等待新任務到來時會有超時策略,這個時間間隔由keepAliveTime所指定,當等待時間超出keepAliveTime所指定的時長后,核心線程就會被終止。

maximumPoolSize--線程池所能容納的最大線程數,當活動線程數達到這個數值后,后續的新任務將會被阻塞。

keepAliveTime--非核心線程閑置的超時時長,超過這個時長,非核心線程就會被回收。當ThreadPoolExecutor的屬性allowCoreThreadTimeOut值為true時,keepAliveTime也作用于核心現程。

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

workQueue--線程池中的任務隊列,通過線程池的executor方法提交的Runnable對象會存儲在這個參數中。

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

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

ThreadPoolExecutor執行任務時大致遵循如下規則:

1 如果線程池中的線程數未達到核心數量,那么會直接啟動一個核心線程來執行任務。

2 如果線程池中的線程數已達到或者超過核心數量,那么任務會被插入到任務隊列中排隊等待執行。

3 如果在步驟2中無法將任務插入到任務隊列中,這往往是由于任務隊列已滿,這個時候如果線程數量未達到線程規定的最大值,那么會立刻啟動一個非核心線程來執行任務。

4 如果步驟3中線程數量已經達到線程池規定的最大值,那么就拒絕執行任務,ThreadPoolExecutor會調用RejectedExecutionHander的rejectedExecution方法來通知調用者。

到此,相信大家對“Java線程池的使用方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

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

AI

乌兰浩特市| 长葛市| 莒南县| 涿鹿县| 无锡市| 万州区| 瑞安市| 宁夏| 乐亭县| 象州县| 垦利县| 淮北市| 虞城县| 朝阳区| 沐川县| 南康市| 叶城县| 开鲁县| 都江堰市| 通榆县| 丰城市| 临沧市| 乌审旗| 遂昌县| 文昌市| 巴塘县| 潼关县| 广宗县| 运城市| 五指山市| 阿克苏市| 大关县| 潮州市| 姜堰市| 麻城市| 太和县| 仙游县| 清水县| 洛宁县| 奉贤区| 武安市|