1. 程式人生 > >java多執行緒(6)

java多執行緒(6)

假設這裡有一個系統,大概每秒需要處理5萬條資料,這5萬條資料為一個批次,而這每秒傳送的5萬條資料需要經過兩個處理過程,第一步是資料存入資料庫,第二步是對資料進行其他業務的分析
使用執行緒池的方式的話,可以實現指定執行緒的數量,這樣的話就算再多的資料需要入庫,只需要排隊等待執行緒池的執行緒即可,就不會出現執行緒池過多而消耗系統資源的情況

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import
java.util.concurrent.TimeUnit; public class ThreadUtils { public static void execute(Runnable run) { executor.execute(run); } private static int nThreads = 20; private static int MAX_QUEUQ_SIZE = 2000; private static ExecutorService executor = new ThreadPoolExecutor(nThreads, nThreads, 0
L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(MAX_QUEUQ_SIZE), new ThreadPoolExecutor.CallerRunsPolicy()); }

阿里巴巴編碼規範:
執行緒池不允許使用 Executors 去建立,而是通過 ThreadPoolExecutor 的方式, 這樣的處理方式讓寫的同學更加明確執行緒池的執行規則,規避資源耗盡的風險。

說明:Executors 各個方法的弊端:

1)newFixedThreadPool和newSingleThreadExecutor:
  主要問題是堆積的請求處理佇列可能會耗費非常大的記憶體,甚至OOM。
2)newCachedThreadPool和newScheduledThreadPool:
  主要問題是執行緒數最大數是Integer.MAX_VALUE,可能會建立數量非常多的執行緒,甚至OOM。