java多线程设置 线程超时 非阻塞实现

线程是属于异步计算模型,所以你不可能直接从别的线程中得到函数返回值。
这时候,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;
        });





CompletableFuture.supplyAsync 方法Demo演示


import java.util.concurrent.CompletableFuture;
public class Test {

    public Test() {
        // TODO Auto-generated constructor stub
    }

    public static void main(String[] s) {
        System.err.println("Start");
        // 返回值为boolean
        CompletableFuture.supplyAsync(() -> {

            try {
                //阻塞10秒
                Thread.sleep(10 * 1000);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return true;
        });
        System.err.println("end");
    }
}

你可能感兴趣的:(java)