在创建多线程程序的时候,我们常实现Runnable接口,Runnable没有返回值,要想获得返回值,Java5提供了一个新的接口Callable,可以获取线程中的返回值,但是获取线程的返回值的时候,需要注意,我们的方法是异步的,获取返回值的时候,线程任务不一定有返回值,所以,需要判断线程是否结束,才能够去取值。

测试代码

package com.wuwii.test;import java.util.concurrent.*;/*** @author Zhang Kai* @version 1.0* @since <pre>2017/10/31 11:17</pre>*/
public class Test {private static final Integer SLEEP_MILLS = 3000;private static final Integer RUN_SLEEP_MILLS = 1000;private int afterSeconds = SLEEP_MILLS / RUN_SLEEP_MILLS;// 线程池(根据机器的核心数)private final ExecutorService fixedThreadPool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());private void testCallable() throws InterruptedException {Future<String> future = null;try {/*** 在创建多线程程序的时候,我们常实现Runnable接口,Runnable没有返回值,要想获得返回值,Java5提供了一个新的接口Callable** Callable需要实现的是call()方法,而不是run()方法,返回值的类型有Callable的类型参数指定,* Callable只能由ExecutorService.submit() 执行,正常结束后将返回一个future对象。*/future = fixedThreadPool.submit(() -> {Thread.sleep(SLEEP_MILLS);return "The thread returns value.";});} catch (Exception e) {e.printStackTrace();}if (future == null) return;for (;;) {/*** 获得future对象之前可以使用isDone()方法检测future是否完成,完成后可以调用get()方法获得future的值,* 如果直接调用get()方法,get()方法将阻塞到线程结束,很浪费。*/if (future.isDone()) {try {System.out.println(future.get());break;} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}} else {System.out.println("After " + afterSeconds-- + " seconds,get the future returns value.");Thread.sleep(1000);}}}public static void main(String[] args) throws InterruptedException {new Test().testCallable();}
}

运行结果:

After 3 seconds,get the future returns value.
After 2 seconds,get the future returns value.
After 1 seconds,get the future returns value.
The thread returns value.

总结:

  1. 需要返回值的线程使用Callable 接口,实现call 方法;
  2. 获得future对象之前可以使用isDone()方法检测future是否完成,完成后可以调用get()方法获得future的值,如果直接调用get()方法,get()方法将阻塞到线程结束。

Java中使用有返回值的线程相关推荐

  1. java 参数返回_Java基础---Java中带参数返回值方法的使用(四十)

    Java 中带参带返回值方法的使用 如果方法既包含参数,又带有返回值,我们称为带参带返回值的方法. 例如:下面的代码,定义了一个 show 方法,带有一个参数 name ,方法执行后返回一个 Stri ...

  2. Java基础---Java中带参数返回值方法的使用(四十)

    Java 中带参带返回值方法的使用 如果方法既包含参数,又带有返回值,我们称为带参带返回值的方法. 例如:下面的代码,定义了一个 show 方法,带有一个参数 name ,方法执行后返回一个 Stri ...

  3. java中数组的返回值是什么类型_java基础学习:数组的常用操作与基础二维数组用法、及基本数据类型和引用数据类型赋值的区别...

    一.Arrays jdk中为了便于开发,给开发者提供了Arrays类,其中包含了很多数组的常用操作.例如快速输出.排序.查找等. 1.数组的常用方法 1.数组以字符串形式的输出,2.sort对数组排序 ...

  4. java中数组的返回值是什么类型_面试必问:Java中String类型为什么设计成不可变的?...

    这几天在各大平台上都看到过这样一些帖子,全都是关于String类型对象不可变的问题,当然现在也是找工作的准备时期,因此花了一部分时间对其进行整理一下. 想要完全了解String,在这里我们需要解决以下 ...

  5. java中数组的返回值是什么类型_Java数组也是一种数据类型

    Java 的数组要求所有的数组元素具有相同的数据类型.因此,在一个数组中,数组元素的类型是唯一的,即一个数组里只能存储一种数据类型的数据,而不能存储多种数据类型的数据.因为 Java 语言是面向对象的 ...

  6. java中数组的返回值是什么类型_打印java 数组的最简单方式是什么?

    简介 问题来源于stackoverflow. 在java语言中,数组是无法重写toString.如果直接打印一个数组,则得到className+'@'+ hashCode数组的十六进制. int[] ...

  7. java return返回值_java中关于return返回值的用法详解

    我们输入一个条件时,系统就会对这个条件进行判断,然后给出一个返回时的结论,我们把这个结果看做是返回值.在java里可以使用return语句来进行返回,从字面意思就能很好的理解它的用法了.下面我们就re ...

  8. java开启线程的方法_Java有几种方法开启线程?怎么实现带有返回值的线程?

    Java有几种方法开启线程?怎么实现带有返回值的线程? 发布时间:2020-05-22 11:20:08 来源:亿速云 阅读:238 作者:Leah Java有几种方法开启线程?怎么实现带有返回值的线 ...

  9. Java线程详解(12)-有返回值的线程

    在Java5之前,线程是没有返回值的,常常为了"有"返回值,破费周折,而且代码很不好写.或者干脆绕过这道坎,走别的路了.现在Java终于有可返回值的任务(也可以叫做线程)了. 可返 ...

最新文章

  1. CPU状态信息us,sy,ni,id,wa,hi,si,st含义
  2. 日本人真会玩!3天众筹60万元来造“机器猫”,会说话摇尾巴的那种
  3. git cherry-pick命令
  4. 跟小段一起学Solaris(20)---ipFilter防火墙
  5. 【LeetCode】103# 二叉树的锯齿形层次遍历
  6. ActionForm类及表单数据验证
  7. 苹果6发布时间_苹果秋季发布会将在北京时间9月16日举办
  8. 第2章 Python 数字图像处理(DIP) --数字图像基础4 -- 像素间的一些基本关系 - 邻域 - 距离测试
  9. html排序按钮_插件分享 | 可进行排序扫描任务的Task Queue
  10. 8位16进制频率计设计实验--VHDL
  11. DataGridView 编程
  12. Windows平台上的Domino服务器挂起的数据收集步骤
  13. 学习图(最短路径)算法
  14. mysql identity_insert_由MYSQL SET IDENTITY_INSERT tablename ON;准确方法
  15. 楚留香pc端无法获取服务器信息,楚留香手游PC端无响应解决方法
  16. CPU保护模式 分页表 描述符 段选择子
  17. 菜鸟的一些常用快捷键的使用总结
  18. ShadowMap教程
  19. 001.学习Python之-设置你的操作系统的环境变量,以便可以轻松进入 Python 环境
  20. 金融统计分析python论文_比较好写的本科金融专业论文题目 本科金融专业论文题目怎么取...

热门文章

  1. [转载] 算法竞赛中的JAVA使用笔记
  2. splat net_Ruby中的Splat参数
  3. Java OutputStream close()方法与示例
  4. Java文件类boolean isDirectory()方法(带示例)
  5. sql server与oracle的分页,详解SQLServer和Oracle的分页查询
  6. Python | 使用__del __()和__init __()实现析构函数和构造函数的示例
  7. i2c-toos 交互数据_什么是CD-i(交互式光盘)?
  8. c+pow函数的头文件_pow()函数以及C ++中的示例
  9. 计算机二级考试C++考试大纲
  10. 计算机网络(第四章网络层)