FutureTask
仅在计算完成时才能获取结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,就不能再重新开始或取消计算。
建立个callable。返回一个string
static class nCallable implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("now,this callable is calculating...");
return "some object";
}
}
建立一个main函数。
public static void main(String[] args) {
FutureTask<String> ft = new FutureTask<String>(new nCallable());
System.out.println("future task start up.");
ft.run();
try {
System.out.println(ft.get());
System.out.println(ft.get());
System.out.println(ft.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println("future task run finished.");
}
利用FutureTask这个特性。当对某个对象只进行一次初始化的情况下。这个特性就有用了。
例如访问一个cache,cache只能进行一次初始化,如果有两个线程并发进行初始化这个cache的情况下,如果不加控制,那么很可能cache会被初始化两次。现在使用FutureTask可以避免这个问题。
public V initialize(Object id, Callable<V> callable) throws Exception {
//
FutureTask<V> task = tasks.get(id);
if(task == null) {
task = new FutureTask<V>(callable);
FutureTask<V> existing = tasks.putIfAbsent(id, task);
if(existing == null) {
task.run();
} else {
task = existing;
}
}
//
try {
return task.get();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return null;
} catch (ExecutionException e) {
if(e.getCause() instanceof Error) {
throw (Error)e.getCause();
} else {
throw (Exception)e.getCause();
}
} finally {
}
}
两个线程并发访问到initialize方法
Time | Thread1 | Thread2 |
A | tasks.get(id)==null | |
B | | tasks.get(id)==null |
C | new FutureTask | new FutureTask |
D | tasks.putIfAbsent | tasks.putIfAbsent | only one will put success. |
E | if put scuess | |
E | | tasks.putIfAbsent <> null |
F | task.run() | task = existing |
G | task.get() | task.get() | same result |
分享到:
相关推荐
主要介绍了futuretask用法及使用场景介绍,小编觉得挺不错的,这里分享给大家,供大家参考。
NULL 博文链接:https://dingran.iteye.com/blog/1864962
最代码,http://www.zuidaima.com/share/1724478138158080.htm 的代码及例子
主要介绍了Java中的Runnable,Callable,Future,FutureTask的比较的相关资料,需要的朋友可以参考下
FutureTask原始码解析 一,FutureTask是什么? FutureTask是可取消的异步的计算任务,它可以通过线程池和线程对象执行,一般来说是FutureTask用于耗时的计算。 二,FutureTask继承图 三,未来任务源码 FutureTask的...
主要介绍了Java线程池FutureTask实现原理详解,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
在本篇文章里我们给大家分享了java中Future与FutureTask之间的关系的内容,有需要的朋友们可以跟着学习下。
FutureTask底层实现分析,有了FutureTask主线程要想获得工作线程(异步计算线程)的结果变得比较简单
主要介绍了简谈java并发FutureTask的实现,FutureTask都是用于获取线程执行的返回结果。文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下
主要介绍了futuretask源码分析(推荐),小编觉得还是挺不错的,这里给大家分享下,供各位参考。
主要介绍了Java FutureTask类使用案例解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值析,需要的朋友可以参考下
主要为大家详细介绍了Java中Future、FutureTask原理以及与线程池的搭配使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Future Future是一个接口,它定义了5个方法: boolean cancel(boolean mayInterruptIfRunning); boolean isCancelled(); boolean isDone(); V get() throws InterruptedException, ExecutionException;...
Java 多线程与并发(17_26)-JUC线程池_ FutureTask详解
通过合规策略对服务器进行监控,确保服务器的运行、帐号在服务器上的操作符合预设的规则。日志:收集、整理服务器的日志信息,提供给管理员查看,并作为异常判断、故障排查的依据。进程:监控服务器上的进程,并对...
tiny-asyncload 看源码时,根据其原理模仿实现的一套future task 优雅调用的框架,主要用于学习futureTask,以及加深对动态代理的理解.
JAVA线程总结,包含线程池,显示使用线程实现异步编程,基于JDK中的Future实现异步编程,JDK中的FutureTask等
这是一个集齐了runnable与callnable的线程处理包,自动集齐全部功能,只需引用即可
http://blog.csdn.net/yangzhaomuma/article/details/51722779
计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,...