<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          圖文并茂講線程池

          共 2540字,需瀏覽 6分鐘

           ·

          2022-06-10 04:13


          基本組成

          1、線程池管理器(ThreadPool):用于創(chuàng)建并管理線程池,包括 創(chuàng)建線程池,銷毀線程池,添加新任務(wù);
          2、工作線程(PoolWorker):線程池中線程,在沒有任務(wù)時(shí)處于等待狀態(tài),可以循環(huán)的執(zhí)行任務(wù);
          3、任務(wù)接口(Task):每個(gè)任務(wù)必須實(shí)現(xiàn)的接口,以供工作線程調(diào)度任務(wù)的執(zhí)行,它主要規(guī)定了任務(wù)的入口,任務(wù)執(zhí)行完后的收尾工作,任務(wù)的執(zhí)行狀態(tài)等;
          4、任務(wù)隊(duì)列(taskQueue):用于存放沒有處理的任務(wù)。提供一種緩沖機(jī)制。

          • 降低資源消耗。通過重復(fù)利用已創(chuàng)建的線程降低線程創(chuàng)建和銷毀造成的消耗。

          • 提高響應(yīng)速度。當(dāng)任務(wù)到達(dá)時(shí),任務(wù)可以不需要的等到線程創(chuàng)建就能立即執(zhí)行。

          • 提高線程的可管理性。使用線程池可以進(jìn)行統(tǒng)一的分配,調(diào)優(yōu)和監(jiān)控,延時(shí)執(zhí)行、定時(shí)循環(huán)執(zhí)行的策略等。

          java.uitl.concurrent.ThreadPoolExecutor類是線程池中最核心的一個(gè)類

          構(gòu)造參數(shù)

          java.uitl.concurrent.ThreadPoolExecutor類是線程池中最核心的一個(gè)類
          構(gòu)造參數(shù)public ThreadPoolExecutor(???int?corePoolSize,?//該線程池中核心線程數(shù)最大值。線程池新建線程的時(shí)候,如果當(dāng)前線程總數(shù)小于corePoolSize,則新建的是核心線程,如果超過corePoolSize,則新建的是非核心線程??核心線程默認(rèn)情況下會(huì)一直存活在線程池中,即使這個(gè)核心線程啥也不干(閑置狀態(tài))。如果指定ThreadPoolExecutor的allowCoreThreadTimeOut這個(gè)屬性為true,那么核心線程如果不干活(閑置狀態(tài))的話,超過一定時(shí)間(時(shí)長(zhǎng)下面參數(shù)決定),就會(huì)被銷毀掉?????int?maximumPoolSize,//(線程不夠用時(shí)能夠創(chuàng)建的最大線程數(shù))線程總數(shù)?=?核心線程數(shù)?+?非核心線程數(shù)???long?keepAliveTime,?//非核心線程閑置超時(shí)時(shí)長(zhǎng) TimeUnit unit, // keepAliveTime的單位,TimeUnit是一個(gè)枚舉類型 BlockingQueue workQueue, //任務(wù)隊(duì)列:維護(hù)著等待執(zhí)行的Runnable對(duì)象 當(dāng)所有的核心線程都在干活時(shí),新添加的任務(wù)會(huì)被添加到這個(gè)隊(duì)列中等待處理,如果隊(duì)列滿了,則新建非核心線程執(zhí)行任務(wù) ThreadFactory threadFactory, //創(chuàng)建新線程,Executors.defaultThreadFactory() RejectedExecutionHandler handler) //線程池的飽和策略

          通過ThreadPoolExecutor.execute(Runnable command)方法即可向線程池內(nèi)添加一個(gè)任務(wù)

          當(dāng)一個(gè)任務(wù)被添加進(jìn)線程池時(shí)

          1、線程數(shù)量未達(dá)到corePoolSize,則新建一個(gè)線程(核心線程)執(zhí)行任務(wù)
          2、線程數(shù)量達(dá)到了corePools,則將任務(wù)移入隊(duì)列BlockingQueue等待
          3、如果無法將任務(wù)加入BlockingQueue(隊(duì)列已滿),則在非corePool中創(chuàng)建新的線程來處理任務(wù)(注意,執(zhí)行這一步驟需要獲取全局鎖)。
          4、隊(duì)列已滿,總線程數(shù)又達(dá)到了maximumPoolSize,(RejectedExecutionHandler)拋出異常

          四種java實(shí)現(xiàn)好的線程池

          CachedThreadPool()

          可緩存線程池:
          線程數(shù)無限制
          有空閑線程則復(fù)用空閑線程,若無空閑線程則新建線程
          一定程序減少頻繁創(chuàng)建/銷毀線程,減少系統(tǒng)開銷

          FixedThreadPool()

          定長(zhǎng)線程池:
          可控制線程最大并發(fā)數(shù)(同時(shí)執(zhí)行的線程數(shù))
          超出的線程會(huì)在隊(duì)列中等待

          ScheduledThreadPool()

          定長(zhǎng)線程池:
          支持定時(shí)及周期性任務(wù)執(zhí)行。

          SingleThreadExecutor()

          單線程化的線程池:
          有且僅有一個(gè)工作線程執(zhí)行任務(wù)
          所有任務(wù)按照指定順序執(zhí)行,即遵循隊(duì)列的入隊(duì)出隊(duì)規(guī)則

          import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;

          public??class?ThreadPoolExecutorTest?{ public static void main(String[] args) { ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); scheduledThreadPool.schedule(new Runnable() {????????????public??void?run()?{ System.out.println("delay 3 seconds"); } }, 3, TimeUnit.SECONDS); }}

          線程池的狀態(tài)

          線程池風(fēng)險(xiǎn):

          死鎖、資源不足、并發(fā)錯(cuò)誤、 線程泄漏、請(qǐng)求過載

          執(zhí)行execute()方法和submit()方法的區(qū)別是什么呢?

          1. execute() 方法用于提交不需要返回值的任務(wù),所以無法判斷任務(wù)是否被線程池執(zhí)行成功與否;

          2. submit()方法用于提交需要返回值的任務(wù)。線程池會(huì)返回一個(gè)future類型的對(duì)象,通過這個(gè)future對(duì)象可以判斷任務(wù)是否執(zhí)行成功,并且可以通過future的get()方法來獲取返回值,get()方法會(huì)阻塞當(dāng)前線程直到任務(wù)完成,而使用get(long timeout,TimeUnit unit)?方法則會(huì)阻塞當(dāng)前線程一段時(shí)間后立即返回,這時(shí)候有可能任務(wù)沒有執(zhí)行完。

          source: //490.github.io/Java多線程與并發(fā)/

          記得點(diǎn)「」和「在看」↓

          愛你們

          瀏覽 78
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  A片在线观看网站 | 一道本高清无码 | 亚洲,日韩,aⅴ在线欧美 | 日韩字幕 | 伊人影视大香蕉 |