Если у меня есть статистика интерфейсы, связанные с заказами, выборка данные должны быть возвращен 3: количество заказов сегодня, сегодня оборот, общий оборот.
Наш общий подход назвать три последовательных функцию, результат, возвращаемый обратным вызовом вызывающего абонента, призывая эти три последовательного выполнения, если каждый вызов занимает 1 секунду, общее время 3 вызова 3 секунды.
Такой подход очень неэффективен, потому что это не имеет значения, порядок между 3 звонков, поэтому использование эффективности параллельного выполнения будет лучше. Например, с помощью пула потоков ExecutorService асинхронных вызовов.
На самом деле Java8 обеспечивает очень быстрый класс аппаратных средств CompletableFuture, можно также реализовать технологию асинхронной:
1 импорт lombok.extern.slf4j.Slf4j; 2 импортных org.springframework.stereotype.Service; 3 4 импорта java.util.concurrent.CompletableFuture; 5 импорта java.util.concurrent.TimeUnit; 6 7 @ SLF4J 8 @Service 9 общественный класс OrderService { 10 11 / ** 12 *今日订单数 13 * 14 * @return 15 * / 16 общественных CompletableFuture <String> todayOrderCount () { 17 вернуться CompletableFuture.supplyAsync (() -> это .getTodayOrderCount ()); 18 } 19 20 общественных CompletableFuture <String> todayTurnover () { 21 возврата CompletableFuture.supplyAsync (() -> это .getTodayTurnover ()); 22 } 23 24 общественного CompletableFuture <String> totalTurnover () { 25 возврата CompletableFuture.supplyAsync (() -> это .getTotalTurnover ()); 26 } 27 28 частных Струнный getTodayOrderCount () { 29 System.out.println ( "Заказы >>>>>>> запросов сегодня:" + . Thread.currentThread () GetName ()); 30 Попробовать { 31 TimeUnit.SECONDS.sleep (1. ;) 32 } улов (InterruptedException Е) { 33 e.printStackTrace (); 34 } 35 возврата "50" ; 36 } 37 [ 38 / ** 39 * день оборот 40 * 41 * @return 42 * / 43 Частный Строка getTodayTurnover () { 44 System.out.println ( "операции запроса >>>>>>> сегодня:" + Thread.currentThread () GetName ().); 45 Попробовать { 46 является TimeUnit.SECONDS.sleep (1. ;) 47 } улов (InterruptedException Е) { 48 e.printStackTrace (); 49 } 50 возврата "200" ; 51 } 52 53 / ** 54 * общий оборот 55 * 56 * @return 57 * / 58 Частный Строка getTotalTurnover () { 59 System.out.println ( ">>>>>>> общий запрос оборота:" + . Thread.currentThread () GetName ()); 60 Попробовать { 61 TimeUnit.SECONDS.sleep (1. ;) 62 } улов (InterruptedException Е) { 63 e.printStackTrace (); 64 } 65 возврата "800" ; 66 } 67 }
1 импорт com.alibaba.fastjson.JSONObject; 2 импорт com.example.sb.service.test.impl.OrderService; 3 импорта lombok.extern.slf4j.Slf4j; 4 импорта org.springframework.beans.factory.annotation.Autowired; 5 импорта org.springframework.web.bind.annotation.GetMapping; 6 импорта org.springframework.web.bind.annotation.RequestMapping; 7 импорт org.springframework.web.bind.annotation.RestController; 8 9 импорта java.util.concurrent.CompletableFuture; 10 11 @ SLF4J 12 @RestController 13 @RequestMapping ( "/ заказ" ) 14 общественного класса OrderController { 15 16 @Autowired 17 частная OrderService OrderService; 18 19 @GetMapping ( "/ доклад" ) 20 публичного отчета JSONObject () { 21 длинный старт = System.currentTimeMillis (); 22 JSONObject = JSON orderReport (); 23 System.out.println ( "耗时:" + (System.currentTimeMillis () - начать)); 24 Возвращение JSON; 25 } 26 27 частный JSONObject orderReport () { 28 CompletableFuture <String> todayOrderCountFuture = orderService.todayOrderCount (); 29 CompletableFuture <String> todayTurnoverFuture = orderService.todayTurnover (); 30 CompletableFuture <String> totalTurnoverFuture = orderService.totalTurnover (); 31 32 JSONObject = JSON новый JSONObject (); 33 34 todayOrderCountFuture.whenComplete ((V, T) -> { 35 json.put ( "todayOrderCountFuture" , v); 36 }); 37 todayTurnoverFuture.whenComplete ((V, T) -> { 38 json.put ( "todayTurnoverFuture" , v); 39 }); 40 totalTurnoverFuture.whenComplete ((V, T) -> { 41 json.put ( "totalTurnoverFuture" , v); 42 }); 43 44 CompletableFuture.allOf (todayOrderCountFuture, todayTurnoverFuture, totalTurnoverFuture) 45 .thenRun (() -> System.out.println ( "完成!!!!" )) 46 .join (); 47 Возвращение JSON; 48 } 49 }
Доступ Браузер: HTTP: // локальный: 8080 / на заказ / Отчет результатов выполнения снимков следующим образом :
Поскольку вызовы моделируются OrderService каждый занимает 1 секунду, 3 вызовы параллельно, отнимает много времени природа в конечном счете, один второй.