异步执行结果-Callable、Future、FutureTask

Callable

实现Runnable接口的任务执行没有返回值,如果我们希望线程运算后将结果返回,应该使用Callable。Callable代表有返回值的任务。

class CallTask implements Callable<String> {
    @Override
    public String call() throws Exception {
        return Thread.currentThread().getName();
    }
}

返回当前线程名。

public class ThreadPoolDemo {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        //1:使用工厂类获取线程池对象
        ExecutorService exec = Executors.newFixedThreadPool(3);

        //2:提交任务;
        for (int i = 1; i <= 3; i++) {
            Future<String> submit = exec.submit(new CallTask());
            System.out.println(submit.get());
        }
    }
}

在这里插入图片描述


Future

Future表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。

  • V get():等待计算完成,然后获取其结果。
  • boolean isDone():查询任务是否做完。
  • boolean cancel(boolean mayInterruptIfRunning):试图取消对此任务的执行。
  • boolean isCancelled():如果在任务正常完成前将其取消,则返回 true。
class CallTask implements Callable<String> {
    @Override
    public String call() throws Exception {
        System.out.println("call()执行中...");
        Thread.sleep(3000);
        return Thread.currentThread().getName();
    }
}

任务增加3秒处理时间。

public class ThreadPoolDemo {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        //1:使用工厂类获取线程池对象
        ExecutorService exec = Executors.newFixedThreadPool(3);

        //2:提交任务;
        Future<String> future = exec.submit(new CallTask());

        while (!future.isDone()) {
            System.out.println("子进程执行中...");
            Thread.sleep(1000);
        }

        System.out.println(future.get());
    }
}

在这里插入图片描述


FutureTask

public class FutureTask<V> implements RunnableFuture<V>

public interface RunnableFuture<V> extends Runnable, Future<V> 

FutureTask类是Future接口的一个实现。FutureTask 类实现了 RunnableFuture 接口, RunnableFuture 继承了Runnable接口和Future接口。

所以,FutureTask 既可以作为 Runnable 被线程执行,也可以作为 Future 得到传入的 Callable 对象的返回值。

class CallTask implements Callable<String> {
    @Override
    public String call() throws Exception {
        return Thread.currentThread().getName();
    }
}
public class ThreadPoolDemo {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        //1:使用工厂类获取线程池对象
        ExecutorService exec = Executors.newFixedThreadPool(3);

        //2:提交任务;
        FutureTask<String> futureTask = new FutureTask<>(new CallTask());
        Future<?> submit = exec.submit(futureTask);

        System.out.println(submit.get());
        System.out.println(futureTask.get());
    }
}

在这里插入图片描述
结果可见,FutureTask对象可以当作一个有返回值的 Runnable 任务来使用。

FutureTask<String> futureTask = new FutureTask<>(new CallTask())相当于把 Callable 任务转换为 Runnable 任务。然后传参线程池方法Future<?> submit(Runnable task)进行任务执行。

futureTask.get()获取异步运算的结果。

综上所述,FutureTask 对象作为任务执行对象,任务执行后,还可以直接获取任务执行的结果。完美!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不会叫的狼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值