1. 程式人生 > >java中多執行緒一定快嗎?看完就知道!!!

java中多執行緒一定快嗎?看完就知道!!!

理解上下文切換

  即使是單核處理器也支援多執行緒執行程式碼,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

此時多執行緒併發比序列快


所以答案是不一定的!!!那麼為什麼會是這樣的呢??

        因為執行緒有建立和上下文切換的開銷