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

資訊專欄INFORMATION COLUMN

限制Java線程池運行線程以及等待線程數量的策略

Clect / 1963人閱讀

摘要:限制線程池運行線程以及等待線程數量的策略對于所提供的,可以保證可以在內存中有固定數量的線程數運行。指的是當線程池拒絕該任務的時候,線程在本地線程直接。由此限制了線程池的等待線程數與執行線程數

限制Java線程池運行線程以及等待線程數量的策略

對于java.util.concurrent.Executors所提供的FixedThreadPool,可以保證可以在內存中有固定數量的線程數運行。但是由于FixedThreadPool綁定的是LinkedBlockingQueue。隊列的上限沒有限制(默認上限為Integer.MAX_VALUE),不斷的提交新的線程,會造成任務在內存中長時間的堆積。

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

首先看FixedThreadPool的實現:

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

可以看到,FixedThreadPool綁定的是LinkedBlockingQueue。我們需要做的第一個改造就是綁定有大小上線的BlockingQueue,在我的實現中綁定ArrayBlockingQueue并設置了size。

第二個是采用CallerRunsPolicy。ThreadPoolExecutor可以定義不同的任務拒絕策略。CallerRunsPolicy指的是當線程池拒絕該任務的時候,線程在本地線程直接execute。這樣就限制了本地線程的循環提交流程。

    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循環提交了20個線程的時候,10個執行線程,10個線程放入了workingQueue。當提交到第21個線程的時候,會觸發RejectedExecutionHandler。在這里我們配置了CallerRunsPolicy策略。所以會在主線程直接執行該線程。也就是說,在本程序中最多會有11個線程在執行,10個線程在等待。由此限制了線程池的等待線程數與執行線程數

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64881.html

相關文章

  • 美團面試題:Java-線程 ThreadPool 專題詳解

    摘要:去美團面試,問到了什么是線程池,如何使用,為什么要用以下做個總結。二線程池線程池的作用線程池作用就是限制系統中執行線程的數量。真正的線程池接口是。創建固定大小的線程池。此線程池支持定時以及周期性執行任務的需求。 去美團面試,問到了什么是線程池,如何使用,為什么要用,以下做個總結。關于線程之前也寫過一篇文章《高級面試題總結—線程池還能這么玩?》 1、什么是線程池:? java.util...

    enrecul101 評論0 收藏0
  • 美團面試題:Java-線程 ThreadPool 專題詳解

    摘要:去美團面試,問到了什么是線程池,如何使用,為什么要用以下做個總結。二線程池線程池的作用線程池作用就是限制系統中執行線程的數量。真正的線程池接口是。創建固定大小的線程池。此線程池支持定時以及周期性執行任務的需求。 去美團面試,問到了什么是線程池,如何使用,為什么要用,以下做個總結。關于線程之前也寫過一篇文章《高級面試題總結—線程池還能這么玩?》 1、什么是線程池:? java.util...

    wujl596 評論0 收藏0
  • Java并發總結

    摘要:限期阻塞調用方法等待時間結束或線程執行完畢。終止狀態線程執行完畢或出現異常退了。和都會檢查線程何時中斷,并且在發現中斷時提前放回。工廠方法將線程池的最大大小設置為,而將基本大小設置為,并將超時大小設置為分鐘。 wait()、notify()、notifyAll() Object是所有類的基類,它有5個方法組成了等待、通知機制的核心:notify()、notifyAll()、wait()...

    szysky 評論0 收藏0
  • Java 線程詳解

    摘要:最近項目中越來越多需要異步調用的地方,系統中雖有線程池管理,但還有可優化的空間,通過分享該文章,幫助大家了解線程池,同時學習使用線程池開啟線程需要注意的地方。沒錯,上述方法創建的線程池就是。線程池就是程序中的裝修公司,代勞各種臟活累活。 最近項目中越來越多需要異步調用的地方,系統中雖有線程池管理,但還有可優化的空間,通過分享該文章,幫助大家了解線程池,同時學習使用線程池開啟線程需要注意...

    fanux 評論0 收藏0
  • Java線程

    摘要:中的線程池是運用場景最多的并發框架。才是真正的線程池。存放任務的隊列存放需要被線程池執行的線程隊列。所以線程池的所有任務完成后,它最終會收縮到的大小。飽和策略一般情況下,線程池采用的是,表示無法處理新任務時拋出異常。 Java線程池 1. 簡介 系統啟動一個新線程的成本是比較高的,因為它涉及與操作系統的交互,這個時候使用線程池可以提升性能,尤其是需要創建大量聲明周期很短暫的線程時。Ja...

    jerry 評論0 收藏0

發表評論

0條評論

Clect

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<