Java 带执行结果的线程(Callable 、 Future 与 FutureTask)

二、Callable

Callable和Future,一个产生结果,一个拿到结果。
Callable接口中只有一个call()方法,和Runnable相比,该方法有返回值并允许抛出异常。

方法描述
V call()计算结果,如果无法执行则抛出异常。

二、Future

Future表示一个可能还没有完成的异步任务的结果,针对这个结果可以添加Callback以便在任务执行成功或失败后作出相应的操作。

方法描述
V get()阻塞直到计算完成,获得执行结果。
V get(long timeout, TimeUnit unit)阻塞给定时间,获取执行结果。
boolean cancel(boolean mayInterruptIfRunning)尝试取消执行此任务。
boolean isCancelled()判断此任务是否在正常完成之前被取消,如果是返回true。
boolean isDone()判断任务是否完成,如果是返回true。

三、FutureTask

FutureTask可以用做闭锁。(FutureTask实现了 Future语义,表示一种抽象的可生成结果的计算。)FutureTask表示的计算是通过Callable来实现的,相当于一种可生 成结果的Runnable,并且可以处于以下3种状态:等待运行(Waiting to nm),正在运行 (Running)和运行完成(Completed)。“执行完成”表示计算的所有可能结束方式,包括正 常结束、由于取消而结束和由于异常而结束等。当FutureTask进入完成状态后,它会永远 停止在这个状态上。

Future.get的行为取决于任务的状态。如果任务已经完成,那么get会立即返回结果,否则 get将阻塞直到任务进入完成状态,然后返回结果或者抛出异常。FutureTask可以将计算结果从执行计算的线程传递到获取这个结果的线程,而FutureTask的规范确保了这种传递过程能实现结果的安全发布。

public static void main(String[] args) throws ExecutionException, InterruptedException {

     FutureTask<String> future = new FutureTask<>(new Callable<String>() {
        @Override
        public String call() throws InterruptedException {
            Thread.sleep(1000 * 10);
            return "任务执行完成";
        }
    });

    // 开始执行任务
    future.run();

    // 阻塞直到任务执行完成
    String produnctInfo = future.get();

    System.out.println("执行结果:" + produnctInfo);
}

四、示例:Callable 、 Future的使用

public static void main(String[] args) throws Exception {
    ExecutorService executorService = Executors.newCachedThreadPool();

    Future<Integer> future =  executorService.submit(new Callable<Integer>() {
        @Override
        public Integer call() throws Exception {
            int i;
            for (i = 0; i < 10000; i++) {
                System.out.println(i);
            }
            return i;
        }
    });

    System.out.println("计算结果:" + future.get());
    System.out.println("End.");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书香水墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值