您好,登錄后才能下訂單哦!
本篇內容主要講解“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線程池的使用方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。