溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java怎么配置線程池

發布時間:2020-07-27 17:02:51 來源:億速云 閱讀:231 作者:小豬 欄目:編程語言

這篇文章主要為大家展示了Java怎么配置線程池,內容簡而易懂,希望大家可以學習一下,學習完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。

線程池中,常見有涉及到的:

ExecutorService executorService = Executors.newSingleThreadExecutor();
ExecutorService executorService1 = Executors.newCachedThreadPool();
ExecutorService executorService2 = Executors.newFixedThreadPool(3);

關于Executors和ExecutorService從記憶上類似于Collections和List。

但是以上幾種其實不建議使用。最好可以通過自己手動配置ThreadPoolExecutor的形式。

我先創建一個demo:

ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
        2,
        5,
        1L,
        TimeUnit.SECONDS,
        new ArrayBlockingQueue<Runnable>(3),
        Executors.defaultThreadFactory(),
        new ThreadPoolExecutor.AbortPolicy()
    );

涉及7個參數,按順序分別是

int corePoolSize, 
int maximumPoolSize, 
long keepAliveTime, 
TimeUnit unit, 
BlockingQueue<Runnable> workQueue, 
ThreadFactory threadFactory, 
RejectedExecutionHandler handler

具體我首先需要結合參數解釋下線程池的執行原理:

畫了張圖:

Java怎么配置線程池

如果我用銀行辦理業務示例說明如下:

1、首先銀行里面有兩個柜臺,這就是核心線程數(7大參數之一)。

2、然后隨著客戶的增加,可能這個兩個柜臺滿了,然后就要請用戶到等候區里面進行等待。這個等候區就是相當于阻塞隊列(七大參數之一)。

3、然后緊接著客戶越來越多,連阻塞隊列都撐不住了,這個時候,就要請求,上面的領導進行多增加柜臺的操作,這個時候,可能加了三個柜臺,現在就有5個柜臺了。這個時候最大的線程數(七大參數之一)就是5了。

4、但是這個時候可能客戶又越來越多,這個時候新加的柜臺也受不了,就要開始有拒絕策略了(七大參數之一)

5、然后過了一段時間,慢慢的,客戶越來越少了,這個時候,發現漸漸的,柜臺空余出來了。KeepAliveTime(七大參數之一,加上單位,合計兩個參數)指當線程數大于核心線程數時,此為終止前多余的空閑線程等待新任務的最長時間。

6、還有一個參數是工廠,這個我們不做深入研究,直接用默認的工廠即可。

懂得原理以后,我們可以查看下,為什么最好不要直接用,比如:

Executors.newFixedThreadPool(3);

這個的主要原因就是這里面默認隊列的最大值是Integer的最大值。

Java怎么配置線程池

Java怎么配置線程池

所以我們生產中需要自己配置線程池。因為默認隊列的長度太長了,有可能會導致oom。就是內存炸掉了。

這個在阿里的編程思想里面也有說明這一點:

Java怎么配置線程池

這邊我們探討下,拒絕策略。4種策略。就是所有柜臺和等候區全部滿了。會如何處理。

用非常easy的代碼來過下,這塊的內容:

1、AbortPolicy

import java.util.concurrent.*;

public class VolatileTest {
  public static void main(String[] args) throws Exception {
    ExecutorService executorService = new ThreadPoolExecutor(
        2,
        5,
        1L,
        TimeUnit.SECONDS,
        new ArrayBlockingQueue<Runnable>(3),
        Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()
    );

    try {
      for (int i = 0; i < 9; i++) {
        executorService.execute(new Runnable() {
          @Override
          public void run() {
            System.out.println(Thread.currentThread().getName()+"\t"+"辦理業務");
          }
        });
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
    }

  }
}

Java怎么配置線程池

可以看到如果超出的話直接掛了,阻止正常運行。

2、CallerRunsPolicy

輸出

Java怎么配置線程池

發現有一個退回main線程,被main線程處理。即會把任務退回至調用者。

3、DiscardOldestPolicy

這個將會等待時間最久的任務丟掉。

4、DiscardPolicy

多出來的任務會全部丟掉。

以上就是關于Java怎么配置線程池的內容,如果你們有學習到知識或者技能,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女