java 异步调用Future以及FutureTask知多少?
在某些时候,我们希望一个线程执行完某个任务之后,能够给我们返回某些我们想要的数据,在Future中就能实现这样的一个功能,触发哪些潜在不叫好事的操作,把调用线程给解放出来,,让线程能够继续执行有价值的工作,Future使用的范围还是很广的无论是Stream包,还是JUC,都有很多类实现了Future,
Future的使用其实也很简单,看看一下的接口,
public interface Future<V> {
/**
* 尝试去取消这个执行的线程任务,但是如果这个执行任务已经结束了,那么取消就会失败
* 后期如果直接get,程序就会抛出CancellationException
*/
boolean cancel(boolean mayInterruptIfRunning);
/**
* 当任务在在正常完成之前如果执行了cancel(),那么就返回true,否则返回false
*/
boolean isCancelled();
/**
* 查看当前任务是否已完成,如果当前任务已经取消,也是会返回已完成
*/
boolean isDone();
/**
*等待线程执行完成之后获取我们需要的结果
*/
V get() throws InterruptedException, ExecutionException;
/**
* 一般我们不建议使用上面方式,如果这个计算的线程一直阻塞住了,我们不可能一直等待,
* 这个方法指定一个等待的时间,那如果超时还没有获取到结果就会抛出一个TimeoutException异* 常
*/
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}
这些接口既能取消一个线程的执行,也能查看线程是否已经被取消等等
在项目中使用Future更常见的也就是FutureTask, ExecutorService中的submit就是创建的FutureTask,我们先来看一个自己实现的FutureTask小例子
public void test1() {
Callable<String > callable = () -> {
Thread.sleep(2000);
return "TEST";
};
FutureTask<String> future = new FutureTask<>(callable);