很多時候我們都以為要想處理速度更快,那就多開幾個線程跑!
確實多線程在一定情況下比單線程更快。
下面的代碼演示串行和並發執行並累加操作的時間,請分析:下面的代碼並發執行一定比串行執行快嗎?當count的數量增加 1萬 -> 10萬 -> 100萬 -> 1000萬 -> 1億
1 public class ConcurrencyTest { 2 private static final long count = 10000l; 3 4 public static void main(String[] args) throws InterruptedException { 5 for(int i=0; i<10; i++) { 6 concurrency(); 7 serial(); 8 System.out.println("------------------------------------------"); 9 } 10 11 } 12 13 private static void concurrency() throws InterruptedException { 14 long start = System.currentTimeMillis(); 15 Thread thread = new Thread(new Runnable() { 16 @Override 17 public void run() { 18 int a = 0; 19 for (long i = 0; i < count; i++) { 20 a += 5; 21 } 22 } 23 }); 24 thread.start(); 25 int b = 0; 26 for (long i = 0; i < count; i++) { 27 b--; 28 } 29 long time = System.currentTimeMillis() - start; 30 thread.join(); 31 System.out.println("concurrency :" + time + "ms,b=" + b); 32 } 33 34 private static void serial() { 35 long start = System.currentTimeMillis(); 36 int a = 0; 37 for (long i = 0; i < count; i++) { 38 a += 5; 39 } 40 int b = 0; 41 for (long i = 0; i < count; i++) { 42 b--; 43 } 44 long time = System.currentTimeMillis() - start; 45 System.out.println("serial:" + time + "ms,b=" + b + ",a=" + a); 46 } 47 }
測試結果
這是count=1萬的結果,基本上串行要快些
並發 :1ms,b=-10000
串行:0ms,b=-10000,a=50000
------------------------------------------
並發 :0ms,b=-10000
串行:1ms,b=-10000,a=50000
------------------------------------------
並發 :0ms,b=-10000
串行:1ms,b=-10000,a=50000
------------------------------------------
並發 :0ms,b=-10000
串行:0ms,b=-10000,a=50000
------------------------------------------
並發 :1ms,b=-10000
串行:0ms,b=-10000,a=50000
------------------------------------------
並發 :1ms,b=-10000
串行:0ms,b=-10000,a=50000
------------------------------------------
並發 :0ms,b=-10000
串行:1ms,b=-10000,a=50000
------------------------------------------
並發 :0ms,b=-10000
串行:0ms,b=-10000,a=50000
------------------------------------------
並發 :1ms,b=-10000
串行:0ms,b=-10000,a=50000
------------------------------------------
這是count=10萬l的結果,基本上串行要快點點
並發 :4ms,b=-100000
串行:3ms,b=-100000,a=500000
------------------------------------------
並發 :0ms,b=-100000
串行:1ms,b=-100000,a=500000
------------------------------------------
並發 :1ms,b=-100000
串行:0ms,b=-100000,a=500000
------------------------------------------
並發 :0ms,b=-100000
串行:1ms,b=-100000,a=500000
------------------------------------------
並發 :1ms,b=-100000
串行:0ms,b=-100000,a=500000
------------------------------------------
並發 :0ms,b=-100000
串行:0ms,b=-100000,a=500000
------------------------------------------
並發 :1ms,b=-100000
串行:0ms,b=-100000,a=500000
------------------------------------------
並發 :0ms,b=-100000
串行:0ms,b=-100000,a=500000
------------------------------------------
並發 :0ms,b=-100000
串行:1ms,b=-100000,a=500000
------------------------------------------
並發 :0ms,b=-100000
串行:0ms,b=-100000,a=500000
------------------------------------------
這是count=100萬l的結果,基本上並發就要比串行要快了
並發 :5ms,b=-1000000
串行:5ms,b=-1000000,a=5000000
------------------------------------------
並發 :3ms,b=-1000000
串行:7ms,b=-1000000,a=5000000
------------------------------------------
並發 :1ms,b=-1000000
串行:7ms,b=-1000000,a=5000000
------------------------------------------
並發 :1ms,b=-1000000
串行:2ms,b=-1000000,a=5000000
------------------------------------------
並發 :1ms,b=-1000000
串行:2ms,b=-1000000,a=5000000
------------------------------------------
並發 :2ms,b=-1000000
串行:2ms,b=-1000000,a=5000000
------------------------------------------
並發 :1ms,b=-1000000
串行:3ms,b=-1000000,a=5000000
------------------------------------------
並發 :1ms,b=-1000000
串行:2ms,b=-1000000,a=5000000
------------------------------------------
並發 :1ms,b=-1000000
串行:3ms,b=-1000000,a=5000000
------------------------------------------
並發 :1ms,b=-1000000
串行:2ms,b=-1000000,a=5000000
------------------------------------------
余下的讀者可以自己去調試哦。
結論
1.在數量比較小的時候,很明顯串行要比並發更快。
2.因為數量較小的時候,並發會花費很多時間在線程調度上。