在创建多线程程序的时候,我们常实现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 Callable接口——有返回值的线程

    实际开发过程中,我们常常需要等待一批线程都返回结果后,才能继续执行.<线程等待——CountDownLatch使用>中我们介绍了CountDownLatch的使用,通过使用CountDow ...

  2. Java中调用MatLab返回值

    当在Java中使用MatLab函数时,由于语言语法的不同,Matlab返回多个数据时,想在Java中获取到并进行使用.查阅了网上资料,翻箱倒柜加上自己实战,得出方法如下: 如MatLab函数返回的是N ...

  3. java中的方法返回值使用泛型,实现灵活的返回值类型

    痛点:      使用Mybatis框架的时候,想封装一个底层JDBC控制器,用于提供和Mybatis交互的增删改查接口(公用的接口),但由于公用的查询方法可能是用户自定义的任意一个和表对应的java ...

  4. 060、Java中定义有返回值有参数的方法

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  5. Java线程中带有返回值的线程Callable

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

  6. java笔记--用ThreadLocal管理线程,Callable<V>接口实现有返回值的线程

    用ThreadLocal管理线程,Callable<V>接口实现有返回值的线程 ThreadLocal在我的笔记"关于线程同步"的第5种方式里面有介绍,这里就不多说了. ...

  7. Java多线程-新特性-有返回值的线程

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

  8. Java线程:新特征-有返回值的线程

    http://lavasoft.blog.51cto.com/62575/222082/ Java线程:新特征-有返回值的线程 2009-11-04 17:33:56 标签:返回值 职场 线程 休闲 ...

  9. Java线程:新特征-有返回值的线程《转》

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

随机推荐

  1. 【Android应用开发】分享一个录制 Android 屏幕 gif 格式的小技巧

    因为写博客总是需要录制 Android 软件的演示效果, 研究了将近一小时找到了合适的工具; 录制流程 : -- 1. 录制 Android 手机屏幕内容 : 使用 拍大师 软件录制 Android ...

  2. Oracle启用scott用户

    先查询一下目前数据库是否有scott用户 select username,account_status from dba_users where username like '%SCOTT%'; 如果 ...

  3. Android的ViewAnimator及其子类ViewSwitcher-android学习之旅(三十三)

    ViewAnimator继承了FrameLayout,多个组件重合在一起,可以加入多个组件,然后切换的时候会有动画. ViewAnimator及其子类的继承关系 ViewAnimator常用属性 Vi ...

  4. Zeroc Ice Slice语言使用 HelloWorld

    Slice介绍         为了开发多语言支持的RPC服务,需要一种中立的新语言来定义这个服务接口,以便各个编程语言能够准确无误地理解和翻译接口,为此Ice设计了Slice语言.Ice开发的第一步 ...

  5. OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据

    OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据 我们这片博文就来聊聊这个反响很不错的OkHttp了,标题是我恶搞的,本篇将着重详细的 ...

  6. (NO.00002)iOS游戏精灵战争雏形(十二)

    首先要声明的是,前几篇实现的shoot方法不是一定会命中目标,这取决于目标运行的速度,子弹的速度,子弹发射的时机以及弹道路径中是否有障碍物等等. 这也是符合实际情况的.如果你的要求是一旦发出子弹必定击 ...

  7. React Native之AppRegistry模块

    我们在写react native的js的时候,在最后总会加上一段代码: AppRegistry.registerComponent('ReactDemo', () => ReactDemo); ...

  8. equals()与hashCode()方法协作约定

    翻译人员: 铁锚 翻译时间: 2013年11月15日 原文链接: Java equals() and hashCode() Contract 图1 Java所有对象的超类 java.lang.Obje ...

  9. mysql进阶(十八)完全卸载mysql数据库图文教程

    完全卸载mysql数据库图文教程 有时候MySQL不能完全卸载,这时候必须通过一些途径删除掉注册表和一些残余的文件,然后才能重新安装才可以成功! 方法/步骤 1.控制面板-->所有控制面板项-- ...

  10. android资源库

    原文地址:http://blog.csdn.net/xiechengfa/article/details/38830751 在摸索过程中,GitHub上搜集了很多很棒的Android第三方库,推荐给在 ...