本篇內(nèi)容主要講解“Java線程池的使用方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Java線程池的使用方法”吧!
在子洲等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計、網(wǎng)站制作、外貿(mào)營銷網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需規(guī)劃網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都營銷網(wǎng)站建設(shè),外貿(mào)營銷網(wǎng)站建設(shè),子洲網(wǎng)站建設(shè)費(fèi)用合理。
在任務(wù)與執(zhí)行策略之間的隱形耦合
依賴任務(wù)
使用線程封閉機(jī)制的任務(wù)
對相應(yīng)時間敏感的任務(wù)
使用ThreadLocal的任務(wù)
在線程池中,如果任務(wù)依賴于其他任務(wù),那么可能產(chǎn)生死鎖。
程序清單8-1 在單線程中任務(wù)發(fā)生死鎖
public class ThreadDeadLock { Executor executor = Executors.newSingleThreadExecutor(); public class RenderPageTask implements Callable{ @Override public String call() throws Exception { Future 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)提交一個有依賴性的Executor任務(wù)時,要清楚地知道可能會出現(xiàn)線程"饑餓"死鎖,因此需要在代碼或配置Executor的配置文件中記錄線程池的大小限制或配置限制。
除了在線程池大小上的顯示限制外,還可能由于其他資源上的約束而存在一些隱式限制。如果應(yīng)用程序使用一個包含10個連接的JDBC連接池,并且每個任務(wù)需要一個數(shù)據(jù)庫連接,那么線程池就好像只有10個線程,因為當(dāng)超過10個任務(wù)時,新的任務(wù)需要等待其他任務(wù)釋放連接。
運(yùn)行時間較長的任務(wù)
設(shè)置線程池的大小
配置ThreadPoolExecutor
ThreadPoolExecutor是線程池的真正實現(xiàn),它構(gòu)造方法提供了一系列參數(shù)來配置線程池。
public ThreadPoolExecutor (int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueueworkQueue, ThreadFactory threadFactory) {...} public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHander hander) {...}
corePoolSize--線程池的核心線程數(shù),默認(rèn)情況下,核心線程會在線程池中一直存活,即使他們處于限制狀態(tài)。如果將ThreadPoolExecutor的allowCoreThreadTimeOut屬性
設(shè)置為true,那么閑置的線程核心線程在等待新任務(wù)到來時會有超時策略,這個時間間隔由keepAliveTime所指定,當(dāng)?shù)却龝r間超出keepAliveTime所指定的時長后,核心線程就會被終止。
maximumPoolSize--線程池所能容納的最大線程數(shù),當(dāng)活動線程數(shù)達(dá)到這個數(shù)值后,后續(xù)的新任務(wù)將會被阻塞。
keepAliveTime--非核心線程閑置的超時時長,超過這個時長,非核心線程就會被回收。當(dāng)ThreadPoolExecutor的屬性allowCoreThreadTimeOut值為true時,keepAliveTime也作用于核心現(xiàn)程。
unit--用于指定keepAliveTime時間參數(shù)的單位,這是一個枚舉,常用的有TimeOut.MILLISECONDS(毫秒)、TimeOut.SECONDS(秒)以及TimeOut.MINUTES(分鐘)等。
workQueue--線程池中的任務(wù)隊列,通過線程池的executor方法提交的Runnable對象會存儲在這個參數(shù)中。
threadFactory--線程工廠,為線程池提供創(chuàng)建新線程的功能。ThreadFactory是一個接口,它只有一個方法:Thread newThread(Runnable r);
hander--不常用就不做介紹了。
ThreadPoolExecutor執(zhí)行任務(wù)時大致遵循如下規(guī)則:
1 如果線程池中的線程數(shù)未達(dá)到核心數(shù)量,那么會直接啟動一個核心線程來執(zhí)行任務(wù)。
2 如果線程池中的線程數(shù)已達(dá)到或者超過核心數(shù)量,那么任務(wù)會被插入到任務(wù)隊列中排隊等待執(zhí)行。
3 如果在步驟2中無法將任務(wù)插入到任務(wù)隊列中,這往往是由于任務(wù)隊列已滿,這個時候如果線程數(shù)量未達(dá)到線程規(guī)定的最大值,那么會立刻啟動一個非核心線程來執(zhí)行任務(wù)。
4 如果步驟3中線程數(shù)量已經(jīng)達(dá)到線程池規(guī)定的最大值,那么就拒絕執(zhí)行任務(wù),ThreadPoolExecutor會調(diào)用RejectedExecutionHander的rejectedExecution方法來通知調(diào)用者。
到此,相信大家對“Java線程池的使用方法”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!