java多线程Future、FutureTask使用示例,返回异步的结果
2017-09-21 14:44
826 查看
1、Future、FutureTask介绍
Future是一个接口,该接口用来返回异步的结果。FutureTask是一个类,是Future 的一个实现。
2、主要方法
future.get(); 或者 future.get(10000, TimeUnit.MILLISECONDS);1
2
3
获取多线程异步执行结果,但get方法是一个同步方法,如果未拿到结果或者未超时,主线程则一直等待。
future.cancel(boolean flag)1
取消当前future任务。
future.isDone()1
判断当前future是否已经获取到异步结果,或者说异步的多线程是否已经执行完成并返回结果。
future.isCancelled()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异步任务结果
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
相关文章推荐
- java多线程Future、FutureTask使用示例,返回异步的结果
- JAVA多线程实现的三种方式(继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程)
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- java多线程获取返回结果--Callable和Future示例
- 使用java传参调用exe并且获取程序进度和返回结果的一种方法
- java中等待一些线程执行完之后,再去执行别的方法(后者需要使用前者返回的结果)
- 解决Java程序使用MySQL时返回参数为乱码的示例教程
- JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没
- Python学习之使用Future对象来异步返回结果方法详解
- java中等待一些线程执行完之后,再去执行别的方法(后者需要使用前者返回的结果)
- Spring Boot 使用WebAsyncTask异步返回结果
- Java 版本问题 为什么安装新版本的 Java 后,使用命令查看返回的结果还是旧版本号?
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- Java中使用Future获取线程异步执行结果的使用
- Android 中 Handler 引起的内存泄露 在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用。其实这可能导致内存泄露,代码中哪里可能导致内存泄露,又是如何
- C#使用BeginInvoke和EndInvoke异步下载和获取返回结果
- java 使用Callable和Future返回线程执行的结果
- python里使用Future对象来异步返回结果
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- Android(Java)之多线程结果返回——Future 、FutureTask、Callable、Runnable