/** * 测试AsynCallback 异步回调 * @param request * @return */ @RequestMapping(value = "/testAsynCallback",produces="application/json") public @ResponseBody String testAsynCallback() { logger.info("测试AsynCallback,开始==="); /** * 进行异步任务列表 */ List> futureTasks = new ArrayList>(); /** * 线程池 初始化3个线程 和JDBC连接池是一个意思 实现重用 */ ExecutorService executorService = Executors.newFixedThreadPool(3); long start = System.currentTimeMillis(); /** * 类似与run方法的实现 Callable是一个接口,在call中手写逻辑代码 */ Callable callable = new Callable() { @Override public Integer call() throws Exception { Integer res = new Random().nextInt(100); logger.info("call执行[" + res + "]开始!"); Thread.sleep(3000); logger.info("call执行[" + res + "]结束!"); return res; } }; logger.info("将5个任务提交到线程池开始!"); for(int i=0;i<5;i++){ /** * 创建一个异步任务 */ FutureTask futureTask = new FutureTask(callable); futureTasks.add(futureTask); /** * 提交异步任务到线程池,让线程池管理任务 * 由于是异步并行任务,所以这里并不会阻塞 * 注意:一旦提交,线程池如果有可用线程,马上分配执行! */ executorService.submit(futureTask); } logger.info("将5个任务提交到线程池结束!"); logger.info("从异步任务列表中获取所有回调开始!"); int count = 0; for (FutureTask futureTask : futureTasks) { /** * futureTask.get() 得到我们想要的结果 * 该方法有一个重载get(long timeout, TimeUnit unit) 第一个参数为最大等待时间,第二个为时间的单位 */ try { count += futureTask.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } logger.info("从异步任务列表中获取所有回调结束!"); long end = System.currentTimeMillis(); logger.info("线程池的任务全部完成:结果为:"+count+",main线程关闭,进行线程的清理"); logger.info("使用时间:"+(end-start)+"ms"); /** * 清理线程池 */ executorService.shutdown(); logger.info("测试AsynCallback,结束==="); return "testAsynCallbackOK~"; }