1. 程式人生 > >IO型任務,執行緒池越大越好?

IO型任務,執行緒池越大越好?

網傳  "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核心數

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));
    }
多次測試,總耗時在32s左右.

4.2.把執行緒池大小擴大一倍:

 ExecutorService threadPool = Executors.newFixedThreadPool(cpuCount * 2);
多次測試,總耗時在36s左右

這..................