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获取异步计算的结果相关推荐

  1. java 异步调用接口_Java接口异步调用

    java接口调用从调用方式上可以分为3类:同步调用,异步调用,回调:同步调用基本不用说了,它是一种阻塞式的调用,就是A方法中直接调用方法B,从上往下依次执行.今天来说说异步调用. 什么是异步调用? 我 ...

  2. java 获取路径_java 获取当前类的路径

    最近在做项目的时候,自己写了一些配置参数的读取,将配置文件放到具体的位置,然后让程序根据当前类的路径寻找配置文件的路径,但是,发现eclipse的开发坏境下是可以顺利读取到指定路径下的配置文件中的配置 ...

  3. java 获取域名_Java获取域名,Java从URL地址中获取域名,Java从Request 获取域名

    Java  获取主域名方法有很多种,有的用截串方式,我用的一个投机取巧的方式,这个获取域名的方法比较简单,代码也较少. Java从URL地址中获取域名//这样获取的方式,不请求就能获取到域名 URL ...

  4. java severlet 获取当前路径_Java 获取当前路径的方法总结

    Java 获取当前路径的方法总结 1.利用System.getProperty()函数获取当前路径: System.out.println(System.getProperty("user. ...

  5. java ip地址接口_java获取ip地址与网络接口的方法示例

    java.net包 大家应该都知道,网络相关对象在java.net包中,Java net包下的类如下: 1.获取主机对象InetAddress //获取本地主机对象 InetAddress host ...

  6. java 获取秒数_Java获取精确到秒的时间戳(转)

    1.时间戳简介: 时间戳的定义:通常是一个字符序列,唯一地标识某一刻的时间.数字时间戳技术是数字签名技术一种变种的应用.是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01 ...

  7. java 根据日期获取天数_java获取日期之间天数的方法

    //获取两个日期之间的天数 private int daysBetween(Date now, Date returnDate) { Calendar cNow = Calendar.getInsta ...

  8. java 文件md5校验_Java 获取 文件md5校验码

    讯雷下载的核心思想是校验文件的md5值,两个文件若md5相同则为同一文件. 当得到用户下载某个文件的请求后它根据数据库中保留的文件md5比对出拥有此文件的url, 将用户请求挂接到此url上并仿造一个 ...

  9. java calendar字符串显示_Java获取当前时间年月日、时间格式化打印、字符串转日期...

    package com.sysc.simple; import java.text.ParseException; import java.text.SimpleDateFormat; import ...

最新文章

  1. 3分钟看完一篇论文,这个AI文本生成模型把今年NeurIPS 2300+篇总结了个遍
  2. Ubuntu恢复默认的字体
  3. linux c 内核 warning: the frame size of 1040 bytes is larger than 1024 bytes
  4. JSP-05- JSP总结
  5. 字符流---IO学习笔记(三)
  6. μC/OS-Ⅱ的移植
  7. 第5章 Python 数字图像处理(DIP) - 图像复原与重建2 - 瑞利噪声
  8. java获取列族的列_在cassandra-cli中如何获取表中的所有列名以及如何在java中使用hector获取它?...
  9. poj 1005 I Think I Need a Houseboat
  10. RecSys Challenge 历年推荐赛题汇总
  11. 完成3DM以后的总结(2).Xutils的简单使用
  12. 图像处理-自适应的二值化图像
  13. Repost: An introduction to Linux IPC by Michael Kerrisk -- IPC 分类
  14. RHadoop(一)
  15. 计算机ppt制作培训心得,ppt培训心得体会总结范文
  16. unity android光照贴图格式,Unity3D-光照贴图技术
  17. 好兄弟结婚,送给他的小诗
  18. [压位DP]Hdu 6149——Valley Numer II
  19. Postfix配置QQ邮箱发邮件
  20. C语言无符号数赋值为负数时的%d%u输出问题解释

热门文章

  1. 【Elasticsearch】针对初学者的Elasticsearch搜索故障排除
  2. 【Elasticsearch】Elasticsearch之元数据(meta-fields)介绍
  3. 【SpringCloud】服务调用OpenFeign
  4. 【Scala】Scala Java Error: value filter is not a member of *
  5. 【Java】MANIFEST.MF是什么
  6. 11-windows下卸载Orcale
  7. 神了,一次解决Java所有痛难点!
  8. Java中 volatile 关键字的最全总结,赶快给自己查缺补漏吧!
  9. StringHelper--封转自己的字符串工具类
  10. Oracle查看用户、用户权限、用户表空间、用户默认表空间