java多线程Future、FutureTask使用示例,返回异步的结果
来源:互联网 发布:常见网络诈骗手段有 编辑:程序博客网 时间:2024/05/18 14:14
1、Future、FutureTask介绍
Future是一个接口,该接口用来返回异步的结果。
FutureTask是一个类,是Future 的一个实现。
2、主要方法
- 1
- 2
- 3
获取多线程异步执行结果,但get方法是一个同步方法,如果未拿到结果或者未超时,主线程则一直等待。
- 1
取消当前future任务。
- 1
判断当前future是否已经获取到异步结果,或者说异步的多线程是否已经执行完成并返回结果。
- 1
判断当前future获取异步结果的任务是否被取消。
3、使用场景
从远程获取数据的计算结果,需要一定的时间,并且后面的代码与该数据暂时没有关系,直到最后才会使用该数据。
调用异步函数之后立马返回,主线程继续向下执行,等需要使用异步线程的数据的时候,再来调用获取或者等待获取该异步线程数据。
4、代码示例
ExecutorService threadPool = Executors.newCachedThreadPool();
ViseLog.e("提交异步任务");
Future<HashMap<String,String>> hashMapFuture= threadPool.submit(new Callable<HashMap<String, String>>() {
@Override
public HashMap<String, String> call() throws Exception {
ViseLog.e("异步任务开始执行");
Thread.sleep(1000);
ViseLog.e("异步任务执行完毕,返回执行结果!!!!");
HashMap <String,String> map = new HashMap<String, String>();
map .put("futureKey", "成功获取future异步任务结果");
return map;
}
});
try {
ViseLog.e("====提交异步任务之后,立马返回到主线程继续往下执行");
Thread.sleep(1000);
ViseLog.e("====此时需要获取上面异步任务的执行结果");
} catch (InterruptedException e) {
e.printStackTrace();
}
boolean flag = true;
while (flag){
if(hashMapFuture.isDone()&&!hashMapFuture.isCancelled()){
HashMap<String,String> futureResult = null;
try {
futureResult = hashMapFuture.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
ViseLog.e("====异步任务返回的结果是:"+futureResult.get("futureKey"));
flag = false;
}
};
09-21 14:39:33.694 MainActivity.FromJava(MainActivity.java:177): 提交异步任务
09-21 14:39:33.695 MainActivity.FromJava(MainActivity.java:194): ====提交异步任务之后,立马返回到主线程继续往下执行
09-21 14:39:33.699 MainActivity$3.call(MainActivity.java:181): 异步任务开始执行
09-21 14:39:34.696 MainActivity.FromJava(MainActivity.java:196): ====此时需要获取上面异步任务的执行结果
09-21 14:39:34.700 MainActivity$3.call(MainActivity.java:183): 异步任务执行完毕,返回执行结果!!!!
09-21 14:39:34.700 MainActivity.FromJava(MainActivity.java:212): ====异步任务返回的结果是:成功获取future异步任务结果
ViseLog.e("提交异步任务");
Future<HashMap<String,String>> hashMapFuture= threadPool.submit(new Callable<HashMap<String, String>>() {
@Override
public HashMap<String, String> call() throws Exception {
ViseLog.e("异步任务开始执行");
Thread.sleep(1000);
ViseLog.e("异步任务执行完毕,返回执行结果!!!!");
HashMap <String,String> map = new HashMap<String, String>();
map .put("futureKey", "成功获取future异步任务结果");
return map;
}
});
try {
ViseLog.e("====提交异步任务之后,立马返回到主线程继续往下执行");
Thread.sleep(1000);
ViseLog.e("====此时需要获取上面异步任务的执行结果");
} catch (InterruptedException e) {
e.printStackTrace();
}
boolean flag = true;
while (flag){
if(hashMapFuture.isDone()&&!hashMapFuture.isCancelled()){
HashMap<String,String> futureResult = null;
try {
futureResult = hashMapFuture.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
ViseLog.e("====异步任务返回的结果是:"+futureResult.get("futureKey"));
flag = false;
}
};
09-21 14:39:33.694 MainActivity.FromJava(MainActivity.java:177): 提交异步任务
09-21 14:39:33.695 MainActivity.FromJava(MainActivity.java:194): ====提交异步任务之后,立马返回到主线程继续往下执行
09-21 14:39:33.699 MainActivity$3.call(MainActivity.java:181): 异步任务开始执行
09-21 14:39:34.696 MainActivity.FromJava(MainActivity.java:196): ====此时需要获取上面异步任务的执行结果
09-21 14:39:34.700 MainActivity$3.call(MainActivity.java:183): 异步任务执行完毕,返回执行结果!!!!
09-21 14:39:34.700 MainActivity.FromJava(MainActivity.java:212): ====异步任务返回的结果是:成功获取future异步任务结果
ExecutorService threadPool = Executors.newCachedThreadPool();
ViseLog.e("提交异步任务");
FutureTask<HashMap<String,String>> hashMapFuture= new FutureTask(new Callable<HashMap<String, String>>() {
@Override
public HashMap<String, String> call() throws Exception {
ViseLog.e("异步任务开始执行");
Thread.sleep(1000);
ViseLog.e("异步任务执行完毕,返回执行结果!!!!");
HashMap <String,String> map = new HashMap<String, String>();
map .put("futureKey", "成功获取FutureTask异步任务结果");
return map;
}
});
threadPool.execute(hashMapFuture);
try {
ViseLog.e("====提交异步任务之后,立马返回到主线程继续往下执行");
Thread.sleep(1000);
ViseLog.e("====此时需要获取上面异步任务的执行结果");
} catch (InterruptedException e) {
e.printStackTrace();
}
boolean flag = true;
while (flag){
if(hashMapFuture.isDone()&&!hashMapFuture.isCancelled()){
HashMap<String,String> futureResult = null;
try {
futureResult = hashMapFuture.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
ViseLog.e("====FutureTask异步任务返回的结果是:"+futureResult.get("futureKey"));
flag = false;
}
};
09-21 14:49:16.305 5136-5136/com.vise.snowdemo E/ViseLog: MainActivity.FromJava(MainActivity.java:177): 提交异步任务
09-21 14:49:16.305 5136-5136/com.vise.snowdemo E/ViseLog: MainActivity.FromJava(MainActivity.java:194): ====提交异步任务之后,立马返回到主线程继续往下执行
09-21 14:49:16.306 5136-5221/com.vise.snowdemo E/ViseLog: MainActivity$3.call(MainActivity.java:181): 异步任务开始执行
09-21 14:49:17.307 5136-5136/com.vise.snowdemo E/ViseLog: MainActivity.FromJava(MainActivity.java:196): ====此时需要获取上面异步任务的执行结果
09-21 14:49:17.307 5136-5221/com.vise.snowdemo E/ViseLog: MainActivity$3.call(MainActivity.java:183): 异步任务执行完毕,返回执行结果!!!!
09-21 14:49:17.307 5136-5136/com.vise.snowdemo E/ViseLog: MainActivity.FromJava(MainActivity.java:212): ====FutureTask异步任务返回的结果是:成功获取FutureTask异步任务结果
09-21 14:49:19.062 17832-18027/? E/WifiConfigManager: updateConfiguration freq=5805 BSSID=80:89:17:8d:e6:df RSSI=-61 "huoli-wh"WPA_PSK
ViseLog.e("提交异步任务");
FutureTask<HashMap<String,String>> hashMapFuture= new FutureTask(new Callable<HashMap<String, String>>() {
@Override
public HashMap<String, String> call() throws Exception {
ViseLog.e("异步任务开始执行");
Thread.sleep(1000);
ViseLog.e("异步任务执行完毕,返回执行结果!!!!");
HashMap <String,String> map = new HashMap<String, String>();
map .put("futureKey", "成功获取FutureTask异步任务结果");
return map;
}
});
threadPool.execute(hashMapFuture);
try {
ViseLog.e("====提交异步任务之后,立马返回到主线程继续往下执行");
Thread.sleep(1000);
ViseLog.e("====此时需要获取上面异步任务的执行结果");
} catch (InterruptedException e) {
e.printStackTrace();
}
boolean flag = true;
while (flag){
if(hashMapFuture.isDone()&&!hashMapFuture.isCancelled()){
HashMap<String,String> futureResult = null;
try {
futureResult = hashMapFuture.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
ViseLog.e("====FutureTask异步任务返回的结果是:"+futureResult.get("futureKey"));
flag = false;
}
};
09-21 14:49:16.305 5136-5136/com.vise.snowdemo E/ViseLog: MainActivity.FromJava(MainActivity.java:177): 提交异步任务
09-21 14:49:16.305 5136-5136/com.vise.snowdemo E/ViseLog: MainActivity.FromJava(MainActivity.java:194): ====提交异步任务之后,立马返回到主线程继续往下执行
09-21 14:49:16.306 5136-5221/com.vise.snowdemo E/ViseLog: MainActivity$3.call(MainActivity.java:181): 异步任务开始执行
09-21 14:49:17.307 5136-5136/com.vise.snowdemo E/ViseLog: MainActivity.FromJava(MainActivity.java:196): ====此时需要获取上面异步任务的执行结果
09-21 14:49:17.307 5136-5221/com.vise.snowdemo E/ViseLog: MainActivity$3.call(MainActivity.java:183): 异步任务执行完毕,返回执行结果!!!!
09-21 14:49:17.307 5136-5136/com.vise.snowdemo E/ViseLog: MainActivity.FromJava(MainActivity.java:212): ====FutureTask异步任务返回的结果是:成功获取FutureTask异步任务结果
09-21 14:49:19.062 17832-18027/? E/WifiConfigManager: updateConfiguration freq=5805 BSSID=80:89:17:8d:e6:df RSSI=-61 "huoli-wh"WPA_PSK
阅读全文
0 0
- java多线程Future、FutureTask使用示例,返回异步的结果
- java多线程Future、FutureTask使用示例,返回异步的结果
- paip.java 多线程参数以及返回值Future FutureTask 的使用.
- 利用Future异步获取多线程的返回结果
- 利用Future异步获取多线程的返回结果
- 利用Future异步获取多线程的返回结果
- Java多线程返回结果2 FutureTask
- Java多线程研究06-带返回值的线程定义接口Callable以及Future,FutureTask的使用
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- 【JAVA】java中Future、FutureTask的使用
- 多线程 : 使用 Future 获取线程返回结果
- Java多线程 Callable Future FutureTask
- 【Java多线程】-Callable,Future,FutureTask
- Java 中的 Future 和 FutureTask 的使用
- java 使用Callable和Future返回线程执行的结果
- Java中的Runnable、Callable、Future、FutureTask的区别与示例
- Java中的Runnable、Callable、Future、FutureTask的区别与示例
- (3)Shiro的配置项(SSM和SpringBoot配置)
- Kotlin学习之资料整理
- 安卓安装apk之后直接打开和点击打开的区别
- 详解MySQL大表优化方案
- react-生命周期函数
- java多线程Future、FutureTask使用示例,返回异步的结果
- Java类加载机制详解
- PopupWindow写法
- H5前端基础——盒子模型
- 举出几种 HashMap 的迭代方式
- iPhone开发-点击UIWebView的链接地址时,更改链接地址
- DB2存储过程命令解析
- 正在找工作,回顾十几年工作中的一些小事
- 免费提供一台已搭建好的 nginx + FastDFS图片服务器(Centos6.4),并已测试上传功能