在計算比較簡單,任務耗時較少的情況下,Java使用多線程執行任務的效率往往沒有單線程高,
因為多線程在執行期間切換線程上下文的頻率會成倍提高,執行簡單任務時多線程的線程切換耗時會大量增加執行時間,所以多線程並發最好是盡量用在耗時較多或IO請求的程序上
package hsy.com;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test {
private static ExecutorService executorService = Executors.newFixedThreadPool(10);
public static void main(String[] args){
long stTime = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 100000; j++) {
System.out.println(j);
}
}
System.out.println(System.currentTimeMillis()-stTime);
try {
Thread.sleep(2500);
} catch (InterruptedException e) {
e.printStackTrace();
}
List<Object> list = new ArrayList();
for (int i = 0; i < 10; i++) {
list.add(i);
}
stTime = System.currentTimeMillis();
CompletableFuture[] objects = list.stream().map(i -> CompletableFuture.runAsync(() -> {
for (int j = 0; j < 100000; j++) {
System.out.println(j);
}
}, executorService)).toArray(CompletableFuture[]::new);
CompletableFuture.allOf(objects).join();
System.out.println(System.currentTimeMillis()-stTime);
}
}
執行結果
單線程 2800ms
多線程 3400ms