多執行緒處理併發
阿新 • • 發佈:2022-03-19
這個面試題考察的是如何設計併發,但是,這裡並沒有說“發工資動作”需要用時多少,所以,這裡分情況討論;
假設發工資動作非常快,1μs(微妙)內可給一個人傳送
直接for(int i = 0; i < 100000; i++)即可,總耗時:100000/1000=100ms(毫秒)=0.1s(秒)
假設發工資動作耗時1ms
直接for(int i = 0; i < 100000; i++)的話,總耗時:100000/1000=100s>1min,不能滿足需求了,這裡再開一個執行緒,即,兩個執行緒可將時間縮短到50s,符合1分鐘的需求。
假設發工資耗時1s
當發工資耗時1s時,單執行緒在1分鐘內只能傳送60個人的工資,如果直接考慮開執行緒的話,100000/60=1667個執行緒。
假設給的機器時1個CPU,4個Core的,那麼同時開1667個執行緒的話,這裡寫了一個簡單程式碼,模擬了1個CPU,4個Core時,啟1000個執行緒的情況:
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * @author Wayss. * @date 2019/7/9. */ public class ThreadPoolDemo { public static void main(String [] args) { ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(0, 2000, 1, TimeUnit.SECONDS, newArrayBlockingQueue<Runnable>(1)); for (int i = 0; i < 1000; i++) { WorkThread workThread = new WorkThread(); threadPoolExecutor.execute(workThread); } System.out.println("threadPoolExecutor.shutdown()"); threadPoolExecutor.shutdown(); } } class WorkThread implements Runnable { public void run() {try { System.out.println(Thread.currentThread().getName() + "===執行開始"); //方案一:模擬等待用sleep,不佔用CPU TimeUnit.SECONDS.sleep(10); //方案二:模擬等待用for,佔用CPU //for (long i = 0; i < 9999999999L; i++) ; System.out.println(Thread.currentThread().getName() + "===執行結束"); } catch (Exception e) { e.printStackTrace(); } } }
發現:當執行方案一時,雖然每個執行緒需要10s,但是CPU的使用率仍然比較低;但當執行方案二時,CPU飆升,電腦已經相當卡頓了。
因此,可以得出結論,如果發工資執行緒,大量佔用CPU計算資源,那麼1個CPU,4個Core的機器肯定不能支援,需要加機器;如果發工資執行緒時間耗費在等待IO上面,那麼1個CPU,4個Core是可以啟動2000個執行緒的。
————————————————
版權宣告:本文為CSDN博主「Wayss_S」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/qq1332479771/article/details/90597201