FutureTask使用
FutureTask使用
FutureTask介绍
FutureTask 表示一个异步运算的任务。FutureTask 里面可以传入一个 Callable 的具体实现类,可以对这个异步运算的任务的结果进行等待获取、判断是否已经完成、取消任务等操作。
FutureTask实现接口
FutureTask实现了RunnableFuture接口,而接口RunnableFuture继承了Runnable, Future。
public class FutureTask<V> implements RunnableFuture<V>
public interface RunnableFuture<V> extends Runnable, Future<V>
FutureTask构造函数
FutureTask有两个构造函数,分别可以接受Callable和Runnable的实现类。
public FutureTask(Callable<V> callable) {
if (callable == null)
throw new NullPointerException();
this.callable = callable;
this.state = NEW; // ensure visibility of callable
}
public FutureTask(Runnable runnable, V result) {
this.callable = Executors.callable(runnable, result);
this.state = NEW; // ensure visibility of callable
}
FutureTask的使用
因为FutureTask实现了RunnableFuture接口,而接口RunnableFuture继承了Runnable。所以可以使用Thread来start(),也可以使用线程池executor.execute()和executorService.submit()
又因为接口RunnableFuture继承了 Future接口,我们可以通过FutureTask来获取线程执行的结果。
public static void main(String[] args) {
//创建一个FutureTask
FutureTask futureTask = new FutureTask(new Callable() {
@Override
public Object call() throws Exception {
System.out.println("执行call,并返回数值");
return 5;
}
});
//用线程池
//Executor executor = Executors.newCachedThreadPool();
//ExecutorService pool = Executors.newFixedThreadPool(5);
//executor.execute(futureTask);
//pool.submit(futureTask);
//创建Thread
Thread thread = new Thread(futureTask);
//启动线程
thread.start();
try {
Integer result = (Integer) futureTask.get();
System.out.println("获得的线程执行结果:"+result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
结果
执行call,并返回数值
获得的线程执行结果:5
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)