簡體   English   中英

Java中的線程池執行器

[英]Thread Pool Executor in Java

ExecutorService threadPool = Executors.newFixedThreadPool(N);

for (Runnable task : tasks) {
    threadPool.execute(task);
}

我對多線程有點新意。 這是我在最近的一次采訪中得到的一個問題。 有人可以幫助我解決方案和明確的解釋。 在上面的代碼中,每個任務花費25%的時間進行計算,75%的時間進行I / O. 假設一個四核機器(沒有超線程),線程池N的大小應該是什么,以實現最佳性能而不浪費線程假設無限的I / O容量。

如果您的機器具有無限的I / O,則意味着您可以完全專注於CPU。 每個任務在運行時使用四分之一的CPU。 這意味着,您可以運行四個任務來使一個CPU內核飽和,並使四核機器上的N = 16。

然而,這純粹是理論上的答案。 實際上,您會發現為什么N = 16可能太大或太小的幾個問題。 例如,假設所有16個任務的調度(CPU與IO)相同,並且在同一時刻啟動。 這意味着,在第一個CPU中,強時間幀執行速度降低到四分之一(16個線程爭用四個CPU)。 此外,可以假設,運行OS,調度程序,垃圾收集等需要一定量的CPU負載。 這會使N = 16太大。

另一方面,如果不要求每個任務以最大單獨速度運行,則較大的N可能會為您提供更好的整體性能,例如,如果在某個時間范圍內,超過3/4的線程是做I / O會在那個時刻留下未使用的CPU資源。

我認為,這不是面試問題的重點,但在現實世界中需要考慮的事項。

如果IO不是約束(由於無限的IO容量),您可以專注於可用的核心數量。

ExecutorService threadPool = Executors.newFixedThreadPool(
                             Runtime.getRuntime().availableProcessors());

如果在Executors中使用newWorkStealingPool ,性能將得到進一步提高(來自java 8發行版)

public static ExecutorService newWorkStealingPool()

使用所有可用處理器作為其目標並行度級別創建工作竊取線程池。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM