java併發程式設計 優化多工查詢介面
阿新 • • 發佈:2021-12-17
程式碼展示
/** * @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:在任務量多的情況下 多執行緒速度會越來越顯著