java异步获取结果_java获取异步计算的结果
java Future/Callable/Executors
如何获取一个异步线程的结果呢?使用普通的方法是无法获取异步线程返回结果的,比如继承Thread类、实现Runnable接口这两种方式创建的异步线程是没有返回结果的。
public class Task implements Runnable {
public void run() {
}
}
run方法是没有返回值,并且无法抛出异常信息。只能在run方法内部直接try...catch处理。并不能throws到外层。
那么,针对这种情况如何处理呢?直接看代码吧。
import java.util.concurrent.Future;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
public class FutureTest {
public static void main(String[] args) throws Exception {
// 创建一个有返回值的异步线程
// 创建一个线程池
ExecutorService pool = Executors.newFixedThreadPool(10); //线程池默认容量为10个线程
MyTask task = new MyTask();
//pool.execute(task);
// 提交任务到线程池中,并获取任务返回结果
/*
Future result = pool.submit(new Callable() {
public Integer call() throws Exception {
return 100;
}
});
*/
Future result = pool.submit(task);
System.out.println("任务返回结果:" + result.get()); // result.get()会阻塞线程,等待任务执行完毕。
// 提交任务
Future> results = pool.submit(new MyTask2());
Map map = results.get();
System.out.println("map = " + map);
// 提交任务,这个任务耗时30秒
Future> results3 = pool.submit(new MyTask3());
try {
// get(long timeout, TimeUnit unit) 超时时间设置为15秒,15秒还是没返回结果则报超时异常
Map m = results3.get(15L, TimeUnit.SECONDS);
} catch (Exception e) {
System.out.println("任务执行超时了:" + e);
}
// 任务执行完毕后关闭线程池,实际应用中,可能不需要关闭线程池。可以一直保持着。
// 对于超时的任务仍然会等待(比如有一个任务执行了1个小时,但是超时时间设置为15秒,仍然会等到1小时)
// 直到所有任务执行完毕才关闭线程池
//pool.shutdown();
// 立即关闭线程池,不等待任务执行完毕。
//pool.shutdownNow();
// 主线程不会等待任务执行完毕才往下走。。但是线程池不会关闭,会一直存在。
System.out.println("============= main =================");
}
}
// 任务类
class MyTask implements Callable {
public Integer call() throws Exception {
return 100;
}
}
// 任务类2
class MyTask2 implements Callable> {
public Map call() throws Exception {
Map map = new HashMap();
map.put("msg", "成功");
List list = new ArrayList();
list.add("zhangsan");
list.add("李四");
list.add("王五");
map.put("result", list);
// 增加一个延迟,模拟执行耗时
Thread.sleep(2000);
return map;
}
}
// 任务类3, 模拟超时,在Future获取任务返回结果的时候设置一个超时时间。
class MyTask3 implements Callable> {
public Map call() throws Exception {
Map map = new HashMap();
map.put("msg", "成功");
List list = new ArrayList();
list.add("zhangsan");
list.add("李四");
list.add("王五");
map.put("result", list);
// 增加一个30秒延迟,模拟执行耗时
Thread.sleep(30000);
return map;
}
}
当你的系统有很多任务需要处理的时候使用这种方式很合适,而且还可以设置任务执行的超时时间,不会因为一直等待任务执行而导致主线程等待很久。
java异步获取结果_java获取异步计算的结果相关推荐
- java 异步调用接口_Java接口异步调用
java接口调用从调用方式上可以分为3类:同步调用,异步调用,回调:同步调用基本不用说了,它是一种阻塞式的调用,就是A方法中直接调用方法B,从上往下依次执行.今天来说说异步调用. 什么是异步调用? 我 ...
- java 获取路径_java 获取当前类的路径
最近在做项目的时候,自己写了一些配置参数的读取,将配置文件放到具体的位置,然后让程序根据当前类的路径寻找配置文件的路径,但是,发现eclipse的开发坏境下是可以顺利读取到指定路径下的配置文件中的配置 ...
- java 获取域名_Java获取域名,Java从URL地址中获取域名,Java从Request 获取域名
Java 获取主域名方法有很多种,有的用截串方式,我用的一个投机取巧的方式,这个获取域名的方法比较简单,代码也较少. Java从URL地址中获取域名//这样获取的方式,不请求就能获取到域名 URL ...
- java severlet 获取当前路径_Java 获取当前路径的方法总结
Java 获取当前路径的方法总结 1.利用System.getProperty()函数获取当前路径: System.out.println(System.getProperty("user. ...
- java ip地址接口_java获取ip地址与网络接口的方法示例
java.net包 大家应该都知道,网络相关对象在java.net包中,Java net包下的类如下: 1.获取主机对象InetAddress //获取本地主机对象 InetAddress host ...
- java 获取秒数_Java获取精确到秒的时间戳(转)
1.时间戳简介: 时间戳的定义:通常是一个字符序列,唯一地标识某一刻的时间.数字时间戳技术是数字签名技术一种变种的应用.是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01 ...
- java 根据日期获取天数_java获取日期之间天数的方法
//获取两个日期之间的天数 private int daysBetween(Date now, Date returnDate) { Calendar cNow = Calendar.getInsta ...
- java 文件md5校验_Java 获取 文件md5校验码
讯雷下载的核心思想是校验文件的md5值,两个文件若md5相同则为同一文件. 当得到用户下载某个文件的请求后它根据数据库中保留的文件md5比对出拥有此文件的url, 将用户请求挂接到此url上并仿造一个 ...
- java calendar字符串显示_Java获取当前时间年月日、时间格式化打印、字符串转日期...
package com.sysc.simple; import java.text.ParseException; import java.text.SimpleDateFormat; import ...
最新文章
- 3分钟看完一篇论文,这个AI文本生成模型把今年NeurIPS 2300+篇总结了个遍
- Ubuntu恢复默认的字体
- linux c 内核 warning: the frame size of 1040 bytes is larger than 1024 bytes
- JSP-05- JSP总结
- 字符流---IO学习笔记(三)
- μC/OS-Ⅱ的移植
- 第5章 Python 数字图像处理(DIP) - 图像复原与重建2 - 瑞利噪声
- java获取列族的列_在cassandra-cli中如何获取表中的所有列名以及如何在java中使用hector获取它?...
- poj 1005 I Think I Need a Houseboat
- RecSys Challenge 历年推荐赛题汇总
- 完成3DM以后的总结(2).Xutils的简单使用
- 图像处理-自适应的二值化图像
- Repost: An introduction to Linux IPC by Michael Kerrisk -- IPC 分类
- RHadoop(一)
- 计算机ppt制作培训心得,ppt培训心得体会总结范文
- unity android光照贴图格式,Unity3D-光照贴图技术
- 好兄弟结婚,送给他的小诗
- [压位DP]Hdu 6149——Valley Numer II
- Postfix配置QQ邮箱发邮件
- C语言无符号数赋值为负数时的%d%u输出问题解释
热门文章
- 【Elasticsearch】针对初学者的Elasticsearch搜索故障排除
- 【Elasticsearch】Elasticsearch之元数据(meta-fields)介绍
- 【SpringCloud】服务调用OpenFeign
- 【Scala】Scala Java Error: value filter is not a member of *
- 【Java】MANIFEST.MF是什么
- 11-windows下卸载Orcale
- 神了,一次解决Java所有痛难点!
- Java中 volatile 关键字的最全总结,赶快给自己查缺补漏吧!
- StringHelper--封转自己的字符串工具类
- Oracle查看用户、用户权限、用户表空间、用户默认表空间