1. 程式人生 > 其它 >多執行緒處理併發

多執行緒處理併發

這個面試題考察的是如何設計併發,但是,這裡並沒有說“發工資動作”需要用時多少,所以,這裡分情況討論;

假設發工資動作非常快,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, new
ArrayBlockingQueue<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