java多线程Future、FutureTask使用示例,返回异步的结果
2017-02-07 14:37
676 查看
1、Future、FutureTask介绍
Future是一个接口,该接口用来返回异步的结果。FutureTask是一个类,是Future 的一个实现。
2、主要方法
future.get(); 或者 future.get(10000, TimeUnit.MILLISECONDS);
获取多线程异步执行结果,但get方法是一个同步方法,如果未拿到结果或者未超时,主线程则一直等待。
future.cancel(boolean flag)
取消当前future任务。
future.isDone()
判断当前future是否已经获取到异步结果,或者说异步的多线程是否已经执行完成并返回结果。
future.isCancelled()
判断当前future获取异步结果的任务是否被取消。
3、使用场景
从远程获取数据的计算结果,需要一定的时间,并且后面的代码与该数据暂时没有关系,直到最后才会使用该数据。调用异步函数之后立马返回,主线程继续向下执行,等需要使用异步线程的数据的时候,再来调用获取或者等待获取该异步线程数据。
4、代码示例
package com.test.thread.future;
import java.util.HashMap;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* @author javaloveiphone
* @date 创建时间:2017年2月7日 上午11:33:11
* @Description:
*/
public class FutureTest {
public static void main(String[] args) throws InterruptedException, ExecutionException {
System.out.println("====进入主线程执行任务");
//通过线程池管理多线程
ExecutorService threadPool = Executors.newCachedThreadPool();
//线程池提交一个异步任务
System.out.println("====提交异步任务");
Future<HashMap<String,String>> future = threadPool.submit(new Callable<HashMap<String,String>>() {
@Override
public HashMap<String,String> call() throws Exception {
System.out.println("异步任务开始执行....");
Thread.sleep(2000);
System.out.println("异步任务执行完毕,返回执行结果!!!!");
return new HashMap<String,String>(){
{this.put("futureKey", "成功获取future异步任务结果");}
};
}
});
System.out.println("====提交异步任务之后,立马返回到主线程继续往下执行");
Thread.sleep(1000);
System.out.println("====此时需要获取上面异步任务的执行结果");
boolean flag = true;
while(flag){
//异步任务完成并且未被取消,则获取返回的结果
if(future.isDone()&& !future.isCancelled()){
HashMap<String,String> futureResult = future.get();
System.out.println("====异步任务返回的结果是:"+futureResult.get("futureKey"));
flag = false;
}
}
//关闭线程池
if(!threadPool.isShutdown()){
threadPool.shutdown();
}
}
}
执行结果打印情况如下:
====进入主线程执行任务 ====提交异步任务 ====提交异步任务之后,立马返回到主线程继续往下执行 异步任务开始执行.... ====此时需要获取上面异步任务的执行结果 异步任务执行完毕,返回执行结果!!!! ====异步任务返回的结果是:成功获取future异步任务结果
5、FutureTask 类
因为FutureTask 类是 Future 的一个实现,Future 可实现 Runnable,所以可通过 threadPool 来执行。例如,可用下列内容替换上面带有 submit 的构造(为简化,返回String类型):FutureTask<String> future = new FutureTask<String>(new Callable<String>() { public String call() { return "成功获取future异步任务结果"; } }); threadPool.execute(future);
相关文章推荐
- java多线程Future、FutureTask使用示例,返回异步的结果
- java协变返回类型使用示例
- JAVA多线程实现的三种方式(继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程)
- python中利用Future对象异步返回结果示例代码
- Java--使用ExecutorCompletionService 管理线程池处理任务的返回结果
- C#使用BeginInvoke和EndInvoke异步下载和获取返回结果
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- Java MyBatis 调用聚合函数查询返回结果示例(记录下来,方便不记得时查看)
- Python学习之使用Future对象来异步返回结果方法详解
- java中等待一些线程执行完之后,再去执行别的方法(后者需要使用前者返回的结果)
- Spring Boot 使用WebAsyncTask异步返回结果
- java 使用Callable和Future返回线程执行的结果
- Android(Java)之多线程结果返回——Future 、FutureTask、Callable、Runnable
- 解决Java程序使用MySQL时返回参数为乱码的示例教程
- JAVA 使用HttpClient 实现简单发送HTTP请求 无返回结果
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- Android 中 Handler 引起的内存泄露 在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用。其实这可能导致内存泄露,代码中哪里可能导致内存泄露,又是如何
- 使用java传参调用exe并且获取程序进度和返回结果的一种方法
- 使用java传参调用exe并且获取程序进度和返回结果的一种方法
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果