1. 程式人生 > 其它 >java併發程式設計 優化多工查詢介面

java併發程式設計 優化多工查詢介面

程式碼展示

/**
 * @author OuJianFeng
 * @version 1.0
 * @description: TODO
 * @date 2021/12/16 14:15
 */
@RestController
@RequestMapping("/api")
public class TestController {

    @Resource
    private SourceService sourceService;

    @Resource
    private StudentService studentService;

    @Resource
    private TeacherService teacherService;

    @Resource
    private Executor executor;


    @PostMapping("/multithreading")
    public List<Object> multithreading() throws InterruptedException {
        //記錄開始時間
        long startingTime = System.currentTimeMillis();
        //執行緒計數器 定義為3
        CountDownLatch downLatch = new CountDownLatch(3);

        //防止併發操作情況下出現 併發修改異常,單執行緒不存在這個問題,CopyOnWriteArrayList底層使用Lock鎖,效能可以被保證
        List<Object> list = new CopyOnWriteArrayList<>();

        //執行緒1: 查詢 source表 並新增到list
        executor.execute(() -> {
            list.add(sourceService.findAll());
            downLatch.countDown();// 執行緒計數器-1
        });
        //執行緒2: 查詢 teacher表 並新增到list
        executor.execute(() -> {

            list.add(teacherService.findAll());
            downLatch.countDown();// 執行緒計數器-1
        });
        //執行緒3: 查詢 teacher表 並新增到list
        executor.execute(() -> {
            list.add(studentService.findAll());
            downLatch.countDown();// 執行緒計數器-1
        });

        downLatch.await();//如果計數到達零,則釋放所有等待的執行緒
        //響應結果 取決最後一個執行緒執行時間
        long endingTime = System.currentTimeMillis();

        System.out.println("多執行緒耗時:" + (endingTime - startingTime) + "ms");
        return list;
    }

    @PostMapping("/singleThread")
    public List<Object> singleThread() {
        //記錄開始時間
        long startingTime = System.currentTimeMillis();
        List<Object> list = new ArrayList<>();
        //執行查詢
        list.add(sourceService.findAll());
        list.add(teacherService.findAll());
        list.add(studentService.findAll());
        //結束時間
        long endingTime = System.currentTimeMillis();

        System.out.println("單執行緒耗時:" + (endingTime - startingTime) + "ms");
        return list;
    }
}

執行結果:

多執行緒響應結果平均: 14.8ms

單執行緒響應結果平均: 31.4ms

ps:在任務量多的情況下 多執行緒速度會越來越顯著