国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

限制Java線程池運(yùn)行線程以及等待線程數(shù)量的策略

Clect / 1969人閱讀

摘要:限制線程池運(yùn)行線程以及等待線程數(shù)量的策略對(duì)于所提供的,可以保證可以在內(nèi)存中有固定數(shù)量的線程數(shù)運(yùn)行。指的是當(dāng)線程池拒絕該任務(wù)的時(shí)候,線程在本地線程直接。由此限制了線程池的等待線程數(shù)與執(zhí)行線程數(shù)

限制Java線程池運(yùn)行線程以及等待線程數(shù)量的策略

對(duì)于java.util.concurrent.Executors所提供的FixedThreadPool,可以保證可以在內(nèi)存中有固定數(shù)量的線程數(shù)運(yùn)行。但是由于FixedThreadPool綁定的是LinkedBlockingQueue。隊(duì)列的上限沒(méi)有限制(默認(rèn)上限為Integer.MAX_VALUE),不斷的提交新的線程,會(huì)造成任務(wù)在內(nèi)存中長(zhǎng)時(shí)間的堆積。

我們有可能面臨如下的場(chǎng)景,主線程不斷地提交任務(wù)線程,希望有固定數(shù)量的在線程中運(yùn)行,也不想造成線程在內(nèi)存中大量的等待堆積。由此需要我們自己定義一個(gè)線程池策略。ThreadPoolExecutor為我們線程池的設(shè)置提供了很大的靈活性。

首先看FixedThreadPool的實(shí)現(xiàn):

    public static ExecutorService More ...newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
            return new ThreadPoolExecutor(nThreads, nThreads,
                                          0L, TimeUnit.MILLISECONDS,
                                          new LinkedBlockingQueue(),
                                          threadFactory);
        }

可以看到,F(xiàn)ixedThreadPool綁定的是LinkedBlockingQueue。我們需要做的第一個(gè)改造就是綁定有大小上線的BlockingQueue,在我的實(shí)現(xiàn)中綁定ArrayBlockingQueue并設(shè)置了size。

第二個(gè)是采用CallerRunsPolicy。ThreadPoolExecutor可以定義不同的任務(wù)拒絕策略。CallerRunsPolicy指的是當(dāng)線程池拒絕該任務(wù)的時(shí)候,線程在本地線程直接execute。這樣就限制了本地線程的循環(huán)提交流程。

    BlockingQueue workingQueue = new ArrayBlockingQueue(10);
    RejectedExecutionHandler rejectedExecutionHandler =
        new ThreadPoolExecutor.CallerRunsPolicy();
    ExecutorService threadPool = new ThreadPoolExecutor(10, 10, 0L, TimeUnit.MILLISECONDS,
        workingQueue, rejectedExecutionHandler);

    for (int i = 0; i < 100; i++) {
      
      threadPool.submit(new Callable() {

        @Override
        public Boolean call() throws Exception {
          System.out.println("thread " + String.valueOf(threadNo) + " is called");
          Thread.sleep(10000);
          System.out.println("thread " + String.valueOf(threadNo) + " is awake");
          throw new Exception();
        }

      });
    }

代碼中定義了大小為10的線程池,for循環(huán)提交了20個(gè)線程的時(shí)候,10個(gè)執(zhí)行線程,10個(gè)線程放入了workingQueue。當(dāng)提交到第21個(gè)線程的時(shí)候,會(huì)觸發(fā)RejectedExecutionHandler。在這里我們配置了CallerRunsPolicy策略。所以會(huì)在主線程直接執(zhí)行該線程。也就是說(shuō),在本程序中最多會(huì)有11個(gè)線程在執(zhí)行,10個(gè)線程在等待。由此限制了線程池的等待線程數(shù)與執(zhí)行線程數(shù)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/64881.html

相關(guān)文章

  • 美團(tuán)面試題:Java-線程 ThreadPool 專(zhuān)題詳解

    摘要:去美團(tuán)面試,問(wèn)到了什么是線程池,如何使用,為什么要用以下做個(gè)總結(jié)。二線程池線程池的作用線程池作用就是限制系統(tǒng)中執(zhí)行線程的數(shù)量。真正的線程池接口是。創(chuàng)建固定大小的線程池。此線程池支持定時(shí)以及周期性執(zhí)行任務(wù)的需求。 去美團(tuán)面試,問(wèn)到了什么是線程池,如何使用,為什么要用,以下做個(gè)總結(jié)。關(guān)于線程之前也寫(xiě)過(guò)一篇文章《高級(jí)面試題總結(jié)—線程池還能這么玩?》 1、什么是線程池:? java.util...

    enrecul101 評(píng)論0 收藏0
  • 美團(tuán)面試題:Java-線程 ThreadPool 專(zhuān)題詳解

    摘要:去美團(tuán)面試,問(wèn)到了什么是線程池,如何使用,為什么要用以下做個(gè)總結(jié)。二線程池線程池的作用線程池作用就是限制系統(tǒng)中執(zhí)行線程的數(shù)量。真正的線程池接口是。創(chuàng)建固定大小的線程池。此線程池支持定時(shí)以及周期性執(zhí)行任務(wù)的需求。 去美團(tuán)面試,問(wèn)到了什么是線程池,如何使用,為什么要用,以下做個(gè)總結(jié)。關(guān)于線程之前也寫(xiě)過(guò)一篇文章《高級(jí)面試題總結(jié)—線程池還能這么玩?》 1、什么是線程池:? java.util...

    wujl596 評(píng)論0 收藏0
  • Java并發(fā)總結(jié)

    摘要:限期阻塞調(diào)用方法等待時(shí)間結(jié)束或線程執(zhí)行完畢。終止?fàn)顟B(tài)線程執(zhí)行完畢或出現(xiàn)異常退了。和都會(huì)檢查線程何時(shí)中斷,并且在發(fā)現(xiàn)中斷時(shí)提前放回。工廠方法將線程池的最大大小設(shè)置為,而將基本大小設(shè)置為,并將超時(shí)大小設(shè)置為分鐘。 wait()、notify()、notifyAll() Object是所有類(lèi)的基類(lèi),它有5個(gè)方法組成了等待、通知機(jī)制的核心:notify()、notifyAll()、wait()...

    szysky 評(píng)論0 收藏0
  • Java 線程詳解

    摘要:最近項(xiàng)目中越來(lái)越多需要異步調(diào)用的地方,系統(tǒng)中雖有線程池管理,但還有可優(yōu)化的空間,通過(guò)分享該文章,幫助大家了解線程池,同時(shí)學(xué)習(xí)使用線程池開(kāi)啟線程需要注意的地方。沒(méi)錯(cuò),上述方法創(chuàng)建的線程池就是。線程池就是程序中的裝修公司,代勞各種臟活累活。 最近項(xiàng)目中越來(lái)越多需要異步調(diào)用的地方,系統(tǒng)中雖有線程池管理,但還有可優(yōu)化的空間,通過(guò)分享該文章,幫助大家了解線程池,同時(shí)學(xué)習(xí)使用線程池開(kāi)啟線程需要注意...

    fanux 評(píng)論0 收藏0
  • Java線程

    摘要:中的線程池是運(yùn)用場(chǎng)景最多的并發(fā)框架。才是真正的線程池。存放任務(wù)的隊(duì)列存放需要被線程池執(zhí)行的線程隊(duì)列。所以線程池的所有任務(wù)完成后,它最終會(huì)收縮到的大小。飽和策略一般情況下,線程池采用的是,表示無(wú)法處理新任務(wù)時(shí)拋出異常。 Java線程池 1. 簡(jiǎn)介 系統(tǒng)啟動(dòng)一個(gè)新線程的成本是比較高的,因?yàn)樗婕芭c操作系統(tǒng)的交互,這個(gè)時(shí)候使用線程池可以提升性能,尤其是需要?jiǎng)?chuàng)建大量聲明周期很短暫的線程時(shí)。Ja...

    jerry 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<