java中多執行緒一定快嗎?看完就知道!!!
阿新 • • 發佈:2018-11-11
理解上下文切換
即使是單核處理器也支援多執行緒執行程式碼,CPU通過每個執行緒分配CPU時間片來實現這個機制.時間片是CPU分配給多個執行緒的時間,因為時間片非常短,所以CPU通過不停的切換執行緒執行,讓我們感覺多個執行緒是同時執行的,時間片一般是幾十毫秒(ms).
CPU通過時間片分配演算法來迴圈執行任務,當前任務執行一個時間片後會切換到下一個任務.但是,在切換前會儲存上一個任務的狀態,以便下次切換回這個任務是,可以再載入這個任務狀態.所以任務從儲存到再載入的過程就是一次上下文切換,上下文切換會影響多執行緒的執行速度!!!
多執行緒一定快嗎???
廢話不多說通過程式碼來說話!!!
public class ConcurrencyTest { private static final long count = 10001; public static void main(String[] args) throws InterruptedException { concureency(); serial(); } private static void concureency() throws InterruptedException { long start = System.currentTimeMillis(); Thread thread = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub int a = 0; for(long i = 0; i < count; i++) { a += 5; } } }); thread.start(); int b = 0; for(long i = 0; i < count; i++) { b --; } thread.join(); long time = System.currentTimeMillis() - start; System.out.println("concureency :" + time+"ms,b="+b); } private static void serial() { long start = System.currentTimeMillis(); int a = 0; for (long i = 0; i < count; i++) { a += 5; } int b = 0; for (long i = 0; i < count; i++) { b--; } long time = System.currentTimeMillis() - start; System.out.println("serial:" + time+"ms,b="+b+",a="+a); } }
檢視執行結果:
count = 10001時
concureency :1ms,b=-10001
serial:0ms,b=-10001,a=50005
此時多執行緒相比下是比較慢
count = 1000000001時
concureency :476ms,b=-1000000001
serial:712ms,b=-1000000001,a=705032709
此時多執行緒併發比序列快
所以答案是不一定的!!!那麼為什麼會是這樣的呢??
因為執行緒有建立和上下文切換的開銷