线程是属于异步计算模型,所以你不可能直接从别的线程中得到函数返回值。
这时候,Future就出场了。Futrue可以监视目标线程调用call的情况,当你调用Future的get()方法以获得结果时,当前线程就开始阻塞,直接call方法结束返回结果。
我目前的需求仅是线程超时 抛弃任务
设置超时方法
Future<?> future = executor.submit(c);
try {
future.get(timeout, timeUnit);//阻塞 timeout超时时间 timeUnit设置单位
return true;
} catch (TimeoutException e) {
future.cancel(true);//设置true 超时会终止这个任务,false会把任务跑完
logger.info("任务执行超时,强制退出 ! 任务执行失败sum: " + getErrorCount() + " this协议:" + message.getCmd() + " 超过:" + timeout+ " 毫秒 ");
return false;
CompletableFuture类实现了CompletionStage和Future接口。Future是Java 5添加的类,用来描述一个异步计算的结果,但是获取一个结果时方法较少,要么通过轮询isDone,确认完成后,调用get()获取值,要么调用get()设置一个超时时间。但是这个get()方法会阻塞住调用线程,这种阻塞的方式显然和我们的异步编程的初衷相违背。
为了解决这个问题,JDK吸收了guava的设计思想,加入了Future的诸多扩展功能形成了CompletableFuture。
CompletableFuture.supplyAsync 允许你基于ForkJoinPool 异步地运行一个任务,同时也有选项供你选择更多对线程池的控制
可以指定线程池
static CompletableFuture runAsync(Runnable runnable);
static CompletableFuture runAsync(Runnable runnable, Executor executor);//指定线程池
static CompletableFuture supplyAsync(Supplier supplier);
static CompletableFuture supplyAsync(Supplier supplier, Executor executor);//指定线程池
解决方案2 用jdk1.8 CompletableFuture.supplyAsync 方法 实现非阻塞
supplyAsync是异步提交任务(其实我感觉跟用线程提交类似)
*************************Future线程超时设置 对查询数据类操作 无法停止当前线程******************************
//返回值为boolean
CompletableFuture.supplyAsync(() -> {
Future<?> future = executor.submit(c);
try {
future.get(timeout, timeUnit);//阻塞 timeout超时时间 timeUnit设置单位
return true;
} catch (TimeoutException e) {
future.cancel(true);//设置true 超时会终止这个任务,false会把任务跑完
logger.info("任务执行超时,强制退出 ! 任务执行失败sum: " + getErrorCount() + " this协议:" + message.getCmd() + " 超过:" + timeout+ " 毫秒 ");
return false;
return true;