3.Callable与Future

Callable与Future介绍

Callable介绍:

Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其他线程执行的任务,

Callable的接口定义如下:

//可以看到,这是一个泛型接口,call()函数返回的类型就是传递进来的V类型。
public interface Callable{
   V call() throws Exception; 
}

callable的使用需要配置Future的实现类来使用,我们知道new Thread().start来执行一个线程,但是Thread的入参里面是没有提供Callable的入参参数的,所以就是不能直接运行!!!那我们怎么执行一个实行Callable的实现类呢,别急~到下面讲解Future来执行Callable的过程

Callable和Runnable的区别

  • Callable定义的方法是call,而Runnable定义的方法是run
  • Callable的call方法可以有返回值,而Runnable的run方法不能有返回值
  • Callable的call方法可以抛出异常,而Runnable的run方法不能抛出异常

Future介绍

Future表示异步计算的结果,它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。Future的cancel方法可以取消任务的执行,它有一布尔参数,参数为 true 表示立即中断任务的执行,参数为 false 表示允许正在运行的任务运行完成。Future的 get 方法等待计算完成,获取计算结果

public interface Future {
    boolean cancel(boolean mayInterruptIfRunning);
    boolean isCancelled();
    boolean isDone();
    V get() throws InterruptedException, ExecutionException;
    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}

由此可见提供了5个方法给我们操作

  • cancel 可以中断任务执行
  • isCancelled方法表示任务是否被取消成功,如果在任务正常完成前被取消成功,则返回 true。
  • isDone方法表示任务是否已经完成,若任务完成,则返回true
  • get()方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回;
  • get(long timeout, TimeUnit unit)用来获取执行结果,如果在指定时间内,还没获取到结果,就直接返回null。

一下列子实现Callable接口,然后我们使用Future的实现类FutureTask来获取下一Callable实现类并获取call方法中的返回值

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class FutureTaskTest implements Callable {

    //重写
    @Override
    public Boolean call() throws Exception {
        System.out.println("线程处理中");
        return true;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //通过FutureTask来执行以上定义的Callable,提供了Callable的入参
        FutureTask task = new FutureTask<>(new FutureTaskTest());
        //因为FutureTask实现了Runnable和接口,而new Thread提供了Runnable的入参,所以能执行到call的方法
        new Thread(task).start();
        if (task.get()) {
            System.out.println("线程处理完成");
        }
    }
}
// 执行结果
线程处理中
线程处理完成

你可能感兴趣的:(3.Callable与Future)