java多執行緒(6)
阿新 • • 發佈:2018-11-10
假設這裡有一個系統,大概每秒需要處理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。