IO型任務,執行緒池越大越好?
阿新 • • 發佈:2019-01-06
網傳 "CPU密集型任務,執行緒池size應為CPU數+1; IO密集型任務,執行緒池size應為CPU數/(1-阻塞係數)".
並且,類似的話也出現在<實戰Java高併發程式設計> 這本書裡.
但是,今天正好做到一個類似的東西,於是乎就測試了一下,很奇怪,結果恰恰相反.
1.環境:
1.1.jdk1.8
1.2.mysql5.6 (資料庫位於本地Ubuntu16.04虛擬機器中)
1.3.win10 64bit
2.筆記本配置:
.
3.測試資料庫表及90萬條樣例資料:
4.主要程式程式碼
4.1.當執行緒池大小=CPU核心數
多次測試,總耗時在32s左右.public static void main(String[] args) { final ConfigurableApplicationContext ctx = SpringApplication.run(Application.class, args); int cpuCount = Runtime.getRuntime().availableProcessors(); ExecutorService threadPool = Executors.newFixedThreadPool(cpuCount);//執行緒池大小=CPU核心數 long begin = System.nanoTime(); for (int i = 0; i < cpuCount * 2; i++) { threadPool.submit(new Runnable() { @Override public void run() { UserService userService = ctx.getBean(UserService.class); boolean login = userService.login("1", "2");// 查詢語句: SELECT * FROM `user` ,單詞查詢耗時約4s } }); } threadPool.shutdown(); while (!threadPool.isTerminated()) { } System.out.println("總共耗時:" + BigDecimal.valueOf(System.nanoTime() - begin, 9)); }
4.2.把執行緒池大小擴大一倍:
ExecutorService threadPool = Executors.newFixedThreadPool(cpuCount * 2);
多次測試,總耗時在36s左右
這..................