12.28 60%的Java程序員在錯誤的使用線程池,如何正確創建線程池

前言

阿里的Java開發者手冊中對於線程池的創建有很多強制性的限制,其中最重要的一條就是:

線程池不允許使用Executors去創建,那我們改如何正確的使用Java線程池技術呢?

Java線程池使用場景

Java線程池技術是我們經常會用到的一項技術,例如定時任務、異步數據處理、隊列等我們都會用到線程池技術。Java的JUC包有很多API可以讓我們創建一個線程池,那這些API我們改如何正確使用呢?為什麼在阿里的Java開發者手冊中對於線程池的創建有很多強制性的限制?例如,不能使用Excuro來創建線程池。這篇文章將詳細為大家介紹Java線程池的幾種類型以及如何正確創建線程池。

60%的Java程序員在錯誤的使用線程池,如何正確創建線程池


四種內置線程池


60%的Java程序員在錯誤的使用線程池,如何正確創建線程池


Java JUC包中有四種內置的線程池技術,包括單線程的線程池、固定大小的線程池、可緩存的線程池、定時執行的線程池。

  • 1、單線程的線程池(newSingleThreadExecutor)

單線程的線程池中只有一個線程,也就是所有任務都是通過這一個線程來串行執行,保證了執行任務按照提交順序來執行。如果業務只是涉及到異步執行,可選擇該線程池技術。

  • 2、固定大小的線程池(newFixedThreadPool)

固定大小的線程池創建的時候限制了線程池中線程的數量。當有新的任務創建的時候,就創建一個新的線程來執行任務。

當線程池中的線程數量達到設定的值的時候,任務開始等待執行,直到有可用的線程。

  • 3、可緩存的線程池(newCachedThreadPool)

可緩存的線程池不限定線程數量,當有新的任務加入,如果沒有可用的線程,那就創建新的線程。線程最大數量取決於操作系統所能創建的最大線程數量。此線程池技術也是項目開發中不被推薦的一種方法,因為如何控制不好任務數量,將會導致大量的線程被創建,影響系統的性能

  • 4、定時執行的線程池(newScheduledThreadPool)

定時執行的線程池支持創建無線數量的線程池,並且線程按照設定的時間週期執行。

60%的Java程序員在錯誤的使用線程池,如何正確創建線程池


四種線程池適用不同的業務場景,我們可以根據業務類型來選擇使用。JUC中提供了很多API可以讓我們方便的創建以上四種線程池技術,例如:

  • Executors.newScheduledThreadPool(200)來創建定時執行的線程池;
  • new ThreadPoolExecutor()來創建ThreadPoolExecutord對象,再創建線程池;

那我們該如何正確創建線程池呢?

正確創建線程池


在阿里巴巴Java開發者手冊中有明確規定:禁止使用Executors來創建線程池。

60%的Java程序員在錯誤的使用線程池,如何正確創建線程池


之所以禁止使用Executors創建線程池主要有以下幾點原因:

  • 第一、Executors創建線程池的時候省去了很多參數,大多都是默認的參數,
    導致開發者不能很好理解線程池的運行策略。
  • 第二、使用Executors來創建FixedThreadPool和SingleThreadPool的時候,默認的隊列長度是Integer.MAX_VALUE,即2147483647,這會堆積大量的請求,如果系統處理不過來,就會導致OOM。
  • 第三、使用Executors來創建CachedThreadPool的時候,默認的線程數量是Integer.MAX_VALUE。如果是高併發請求,會導致大量的線程被創建,最終耗盡系統內存,發生內存溢出。

所以,在創建線程池的時候,我們需要正確而嚴謹的使用合理的方式創建,如果使用不當,就會導致系統發生故障。

60%的Java程序員在錯誤的使用線程池,如何正確創建線程池


最後

線程池的正確使用是一個程序員從初級到中高級的標誌,中高級的程序員會接觸到更多需要線程池技術來解決的業務場景所以,精通線程池技術策略以及正確使用線程池尤為重要,希望大家在項目開發中可以合理使用線程池技術,提高系統性能


分享到:


相關文章: