FutureTask 常用来封装 Callable 和 Runnable,也可以作为一个任务提交到线程池中执行。除了作为一个独立的类之外,此类也提供了一些功能性函数供我们创建自定义 task 类使用。FutureTask 的线程安全由CAS来保证。
一、继承关系
public class FutureTask<V> implements RunnableFuture<V>
public interface RunnableFuture<V> extends Runnable, Future<V>
FutureTask实现了runnable和future接口,有以下几个方法:
run() cancel() isCancelled() isDone() get() 延迟get()
由于get()方法是获取线程执行结果的,所以FutureTask对象需要一个Callable的对象,或者runnable+返回值
二、线程的状态转移
一个FutureTask只管理一个线程
对应的线程会在FutureTask层反应为以下的状态转移:
三、核心方法
1、run()
运行任务并set结果给result属性
2、get()
获取线程执行结果,调用这个方法的线程会阻塞等待这个结果
3、awaitDone()
用于等待任务完成,或任务因为中断或超时而终止
4、cancel()
尝试取消任务。如果任务已经完成或已经被取消,此操作会失败。
四、使用示例
static class Task implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("Thread [" + Thread.currentThread().getName() + "] is running");
int result = 0;
for(int i = 0; i < 100;++i) {
result += i;
}
Thread.sleep(3000);
return result;
}
}
1、Future + ExecutorService
Task task = new Task();
ExecutorService service = Executors.newCachedThreadPool();
Future<Integer> future = service.submit(task1);
service.shutdown();
2、FutureTask + ExecutorService
ExecutorService executor = Executors.newCachedThreadPool();
Task task = new Task();
FutureTask<Integer> futureTask = new FutureTask<Integer>(task);
executor.submit(futureTask);
executor.shutdown();
3、FutureTask + Thread
Task task = new Task();
FutureTask<Integer> futureTask = new FutureTask<Integer>(task);
Thread thread = new Thread(futureTask);
thread.start();