1.Callable接口
public interface Callable<V> {
V call() throws Exception;
}
Callable接口只定义了一个函数,从接口的定义当中我们可以看出Callable接口是有返回值的。那么我们如何获取它的返回值呢,这就需要用到java设计好的的一个类FutureTask。
2.Future 接口
Future 接口主要提供了一下几个方法
//取消线程的执行
boolean cancel(boolean mayInterruptIfRunning);
//判断是否停止执行
boolean isCancelled();
//判断线程是否执行完成
boolean isDone();
//获取返回值
V get() throws InterruptedException, ExecutionException;
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
Future接口主要提供了以上几种方法,而FutureTask是它的唯一实现类。
3.案例
(1)首先实现Callable接口
//异步任务
static class Task implements Callable<Integer>{
//返回异步任务的执行结果
@Override
public Integer call() throws Exception {
int i = 0;
for (; i < 10; i++) {
try {
System.out.println(Thread.currentThread().getName() + "_"+i);
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return i;
}
}
(2)将异步任务当做参数传入到FutureTask中
Task work = new Task();
FutureTask<Integer> future = new FutureTask<Integer>(work){
//异步任务执行完成,回调
@Override
protected void done() {
try {
//任务完成调用get()方法就可以得到返回值。
System.out.println("done:"+get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
};
//放入线程池中执行。
ExecutorService executor = Executors.newCachedThreadPool();
executor.execute(future);
当然我们调用future的cancel()方法可以停止任务的执行。有兴趣的同学可以试一下。