少年阿賓

          那些青春的歲月

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

          一、線程池的創(chuàng)建

          我們可以通過(guò)ThreadPoolExecutor來(lái)創(chuàng)建一個(gè)線程池。

          new  ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, milliseconds,runnableTaskQueue, handler);

          創(chuàng)建一個(gè)線程池需要輸入幾個(gè)參數(shù):

          • corePoolSize(線程池的基本大小):當(dāng)提交一個(gè)任務(wù)到線程池時(shí),線程池會(huì)創(chuàng)建一個(gè)線程來(lái)執(zhí)行任務(wù),即使其他空閑的基本線程能夠執(zhí)行新任務(wù)也會(huì)創(chuàng)建線程,等到需要執(zhí)行的任務(wù)數(shù)大于線程池基本大小時(shí)就不再創(chuàng)建。如果調(diào)用了線程池的prestartAllCoreThreads方法,線程池會(huì)提前創(chuàng)建并啟動(dòng)所有基本線程。
          • runnableTaskQueue(任務(wù)隊(duì)列):用于保存等待執(zhí)行的任務(wù)的阻塞隊(duì)列。 可以選擇以下幾個(gè)阻塞隊(duì)列。
            • ArrayBlockingQueue:是一個(gè)基于數(shù)組結(jié)構(gòu)的有界阻塞隊(duì)列,此隊(duì)列按 FIFO(先進(jìn)先出)原則對(duì)元素進(jìn)行排序。
            • LinkedBlockingQueue:一個(gè)基于鏈表結(jié)構(gòu)的阻塞隊(duì)列,此隊(duì)列按FIFO (先進(jìn)先出) 排序元素,吞吐量通常要高于ArrayBlockingQueue。靜態(tài)工廠方法Executors.newFixedThreadPool()使用了這個(gè)隊(duì)列。
            • SynchronousQueue:一個(gè)不存儲(chǔ)元素的阻塞隊(duì)列。每個(gè)插入操作必須等到另一個(gè)線程調(diào)用移除操作,否則插入操作一直處于阻塞狀態(tài),吞吐量通常要高于LinkedBlockingQueue,靜態(tài)工廠方法Executors.newCachedThreadPool使用了這個(gè)隊(duì)列。
            • PriorityBlockingQueue:一個(gè)具有優(yōu)先級(jí)的無(wú)限阻塞隊(duì)列。
          • maximumPoolSize(線程池最大大小):線程池允許創(chuàng)建的最大線程數(shù)。如果隊(duì)列滿了,并且已創(chuàng)建的線程數(shù)小于最大線程數(shù),則線程池會(huì)再創(chuàng)建新的線程執(zhí)行任務(wù)。值得注意的是如果使用了無(wú)界的任務(wù)隊(duì)列這個(gè)參數(shù)就沒(méi)什么效果。
          • ThreadFactory:用于設(shè)置創(chuàng)建線程的工廠,可以通過(guò)線程工廠給每個(gè)創(chuàng)建出來(lái)的線程設(shè)置更有意義的名字。
          • RejectedExecutionHandler(飽和策略):當(dāng)隊(duì)列和線程池都滿了,說(shuō)明線程池處于飽和狀態(tài),那么必須采取一種策略處理提交的新任務(wù)。這個(gè)策略默認(rèn)情況下是AbortPolicy,表示無(wú)法處理新任務(wù)時(shí)拋出異常。以下是JDK1.5提供的四種策略。
            • AbortPolicy:直接拋出異常。
            • CallerRunsPolicy:只用調(diào)用者所在線程來(lái)運(yùn)行任務(wù)。
            • DiscardOldestPolicy:丟棄隊(duì)列里最近的一個(gè)任務(wù),并執(zhí)行當(dāng)前任務(wù)。
            • DiscardPolicy:不處理,丟棄掉。
            • 當(dāng)然也可以根據(jù)應(yīng)用場(chǎng)景需要來(lái)實(shí)現(xiàn)RejectedExecutionHandler接口自定義策略。如記錄日志或持久化不能處理的任務(wù)。
          • keepAliveTime(線程活動(dòng)保持時(shí)間):線程池的工作線程空閑后,保持存活的時(shí)間。所以如果任務(wù)很多,并且每個(gè)任務(wù)執(zhí)行的時(shí)間比較短,可以調(diào)大這個(gè)時(shí)間,提高線程的利用率。
          • TimeUnit(線程活動(dòng)保持時(shí)間的單位):可選的單位有天(DAYS),小時(shí)(HOURS),分鐘(MINUTES),毫秒(MILLISECONDS),微秒(MICROSECONDS, 千分之一毫秒)和毫微秒(NANOSECONDS, 千分之一微秒)。

           

          二、Executors提供了一些方便創(chuàng)建ThreadPoolExecutor的常用方法,主要有以下幾個(gè):

          1、 Executors.newFixedThreadPool(int nThreads);創(chuàng)建固定大小(nThreads,大小不能超過(guò)int的最大值)的線程池

          //線程數(shù)量

           int nThreads = 20;

          //創(chuàng)建executor 服務(wù) 

           ExecutorService executor = Executors.newFixedThreadPool(nThreads) ;

          重載后的版本,需要多傳入實(shí)現(xiàn)了ThreadFactory接口的對(duì)象。

           ExecutorService executor = Executors. newFixedThreadPool(nThreads,threadFactory);

          說(shuō)明:創(chuàng)建固定大小(nThreads,大小不能超過(guò)int的最大值)的線程池,緩沖任務(wù)的隊(duì)列為L(zhǎng)inkedBlockingQueue,大小為整型的最大數(shù),當(dāng)使用此線程池時(shí),在同執(zhí)行的任務(wù)數(shù)量超過(guò)傳入的線程池大小值后,將會(huì)放入LinkedBlockingQueue,在LinkedBlockingQueue中的任務(wù)需要等待線程空閑后再執(zhí)行,如果放入LinkedBlockingQueue中的任務(wù)超過(guò)整型的最大數(shù)時(shí),拋出RejectedExecutionException。

          2、Executors.newSingleThreadExecutor():創(chuàng)建大小為1的固定線程池。

           ExecutorService executor = Executors.newSingleThreadExecutor();

          重載后的版本,需要多傳入實(shí)現(xiàn)了ThreadFactory接口的對(duì)象。

           ExecutorService executor = Executors. newSingleThreadScheduledExecutor(ThreadFactory threadFactory) 

          說(shuō)明:創(chuàng)建大小為1的固定線程池,同時(shí)執(zhí)行任務(wù)(task)的只有一個(gè),其它的(任務(wù))task都放在LinkedBlockingQueue中排隊(duì)等待執(zhí)行。

          3、Executors.newCachedThreadPool();創(chuàng)建corePoolSize為0,最大線程數(shù)為整型的最大數(shù),線程keepAliveTime為1分鐘,緩存任務(wù)的隊(duì)列為SynchronousQueue的線程池。

           ExecutorService executor = Executors.newCachedThreadPool();

          當(dāng)然也可以以下面的方式創(chuàng)建,重載后的版本,需要多傳入實(shí)現(xiàn)了ThreadFactory接口的對(duì)象。

           ExecutorService executor = Executors.newCachedThreadPool(ThreadFactory threadFactory) ;

          說(shuō)明:使用時(shí),放入線程池的task任務(wù)會(huì)復(fù)用線程或啟動(dòng)新線程來(lái)執(zhí)行,注意事項(xiàng):?jiǎn)?dòng)的線程數(shù)如果超過(guò)整型最大值后會(huì)拋出RejectedExecutionException異常,啟動(dòng)后的線程存活時(shí)間為一分鐘。

          4、Executors.newScheduledThreadPool(int corePoolSize):創(chuàng)建corePoolSize大小的線程池。

          //線程數(shù)量

           int corePoolSize= 20;

          //創(chuàng)建executor 服務(wù) 

           ExecutorService executor = Executors.newScheduledThreadPool(corePoolSize) ;

          重載后的版本,需要多傳入實(shí)現(xiàn)了ThreadFactory接口的對(duì)象。

           ExecutorService executor = Executors.newScheduledThreadPool(corePoolSize, threadFactory) ;

          說(shuō)明:線程keepAliveTime為0,緩存任務(wù)的隊(duì)列為DelayedWorkQueue,注意不要超過(guò)整型的最大值。







          posted on 2015-01-21 22:18 abin 閱讀(537) 評(píng)論(0)  編輯  收藏 所屬分類: concurrent
          主站蜘蛛池模板: 本溪市| 庆阳市| 额敏县| 永泰县| 彰武县| 扎鲁特旗| 江山市| 上栗县| 尖扎县| 苏尼特右旗| 涞水县| 瓦房店市| 济南市| 延吉市| 郴州市| 灵川县| 临桂县| 正阳县| 岳西县| 寻甸| 连南| 丹寨县| 邓州市| 阿鲁科尔沁旗| 潼南县| 天门市| 盘山县| 当雄县| 东山县| 墨玉县| 贵南县| 建昌县| 景德镇市| 奇台县| 海兴县| 宁津县| 乐业县| 青川县| 南部县| 隆安县| 来宾市|