Callable与Future介绍
Callable介绍:
Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其他线程执行的任务,
Callable的接口定义如下:
//可以看到,这是一个泛型接口,call()函数返回的类型就是传递进来的V类型。
public interface Callable<V>{
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<V> {
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<Boolean> {
//重写
@Override
public Boolean call() throws Exception {
System.out.println("线程处理中");
return true;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
//通过FutureTask来执行以上定义的Callable,提供了Callable的入参
FutureTask<Boolean> task = new FutureTask<>(new FutureTaskTest());
//因为FutureTask实现了Runnable和接口,而new Thread提供了Runnable的入参,所以能执行到call的方法
new Thread(task).start();
if (task.get()) {
System.out.println("线程处理完成");
}
}
}
// 执行结果
线程处理中
线程处理完成