Java中使用有返回值的线程
2023-09-14 09:06:16 时间
在创建多线程程序的时候,我们常实现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.
总结:
- 需要返回值的线程使用Callable 接口,实现call 方法;
- 获得future对象之前可以使用isDone()方法检测future是否完成,完成后可以调用get()方法获得future的值,如果直接调用get()方法,get()方法将阻塞到线程结束。
相关文章
- 手机平台JAVA-API不完全说明
- java float四舍五入保留两位小数,java四舍五入float保留两位小数
- MySQL字段类型如何转为java_Java JDBC中,MySQL字段类型到JAVA类型的转换
- Java线程和进程区别
- java定时器实例_Java定时器小实例
- java线程dump命令_jdk的dump
- 【Java 集合】Java 集合的线程安全性 ( 加锁同步 | java.utils 集合 | 集合属性 | java.util.concurrent 集合 | CopyOnWrite 机制 )
- 多种负载均衡算法及其 Java 代码实现详解编程语言
- Java 数组到 HashMap 之算法解释详解编程语言
- Java学习笔记之三十二浅谈Java中throw与throws的用法及异常抛出处理机制剖析详解编程语言
- Java常用的非受检异常详解编程语言
- 数据如何使用Java读取MySQL数据(java读取mysql)
- 数据如何使用Java连接MySQL修改数据(javamysql修改)
- Java 连接 Redis:实现数据快速传输(java连redis)
- 时间Redis中Java实现的过期时间功能(redisjava过期)
- 时间设置使用Java在Redis中设置过期时间(redisjava过期)
- Redis Java快速实现过期功能(redisjava过期)
- 控制Redis与Java实现缓存有效期管理(redisjava过期)
- 实现Java实现的Redis封装类:强化Redis技术支持(redis封装类java)
- Java配置Oracle实现稳定的跨平台数据库连接(java配置oracle)