启动一个线程,计算机根据cpu及内存的使用情况,在未来的时间点执行线程内的代码。怎么知道线程是否执行完成,结果是什么呢?Future英文意思“未来、将来的”,顾名思义Future接口应运而生。
一、Future接口介绍
使用方法get进行检索,必要时阻塞,直到它准备好。cancel方法执行取消操作。提供了其他方法来确定任务是正常完成还是被取消。一旦计算完成,就不能取消计算。如果为了可取消而使用Future,但不提供可用的结果,可以声明Future>,并返回null作为底层任务的结果。
返回值 | 方法名称 | 方法用途描述 |
boolean | cancel(boolean mayInterruptIfRunning) | 尝试取消此任务的执行。如果任务已经完成、已经被取消或由于其他原因无法取消,则此尝试将失败。如果成功,并且在调用cancel时该任务没有启动,则该任务永远不应该运行。如果该任务已经启动,则mayInterruptIfRunning参数确定执行该任务的线程是否应该中断以试图停止该任务 |
boolean | isCancelled() | 如果此任务在正常完成之前被取消,则返回true |
boolean | isDone() | 如果此任务完成则返回true |
V | get() | 获取线程执行结果,会一直等待,直到线程执行完成 |
V | get(long timeout, TimeUnit unit) | 获取线程执行结果,如果在指定时间内没有获取到结果则会抛出异常 |
二、Future代码示例
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import org.junit.Test;
public class Future_FutureTask {
//创建线程池
ExecutorService exec = Executors.newCachedThreadPool();
@Test
public void FutureTest() throws Exception {
//返回Future
Future<?> future = exec.submit(() -> {
System.out.println("Runnabel接口,沒有返回值");
});
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (future.isDone()) {
System.out.println("获取线程返回结果:" + future.get());
} else {
System.out.println("获取线程返回结果:" + future.get(10L, TimeUnit.SECONDS));
}
System.out.println("线程是否被取消" + future.isCancelled());
}
}
三、FutureTask实现类介绍
该类提供了Future接口的基本实现;FutureTask可以用来包装成 Callable 或者 Runnable 对象来使用。因为FutureTask实现了Runnable接口,所以FutureTask可以提交给Executor执行
四、FutureTask代码示例
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import org.junit.Test;
public class Future_FutureTask {
// 创建线程池
ExecutorService exec = Executors.newCachedThreadPool();
@Test
public void FutureTaskTest() throws Exception {
// 使用Lambda 表达式创建对象
// FutureTask<V> futureTask = new FutureTask<V>(Callable<V> callable)
FutureTask<String> futureTask = new FutureTask<String>(() -> {
return "FutureTask使用介绍";
});
exec.execute(futureTask);
System.out.println("获取FutureTask的返回结果:" + futureTask.get());
}
}
五、总结
Future表示异步计算(线程)的结果。提供的方法用于检查计算是否完成、等待其完成以及检索计算的结果。
FutureTask类是Future接口的实现类