java 线程public void run()中值如何返回
Executor 接口 执行已提交的 Runnable 任务的对象。此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法。通常使用 Executor 而不是显式地创建线程。例如,可能会使用以下方法,而不是为一组任务中的每个任务调用 new Thread(new(RunnableTask())).start():
Executor executor = anExecutor;
executor.execute(new RunnableTask1());
Future<V>接口表示异步计算的结果,提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。
没有构造器
boolean cancel(boolean mayInterruptIfRunning)试图取消对此任务的执行
V get()如有必要,等待计算完成,然后获取其结果
V get(long timeout, TimeUnit unit)
boolean isCancelled()如果在任务正常完成前将其取消,则返回 true
boolean isDone()如果任务已完成,则返回 true
Executors类中都是静态方法
Thread类,程序中的执行线程。
方法一:Java5新增了Callable接口获得线程的返回值
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class GetReturnValueFromCallable {
private static final int SLEEP_MILLS = 3000;
private static final int SECOND_MILLS = 1000;
private static int sleepSeconds = SLEEP_MILLS / SECOND_MILLS;
ExecutorService executorService = Executors.newCachedThreadPool();
/**
* 在创建多线程程序的时候,我们常实现Runnable接口,Runnable没有返回值,要想获得返回值,Java5提供了一个新的接口Callable
*/
public static void main(String[] args) {
new GetReturnValueFromCallable().testCallable();
}
private void testCallable() {
/**
* Callable需要实现的是call()方法,而不是run()方法,返回值的类型有Callable的类型参数指定,
* Callable只能由ExecutorService.submit() 执行,正常结束后将返回一个future对象
*/
Future<String> future = executorService.submit(new Callable<String>() {
public String call() throws Exception {
Thread.sleep(SLEEP_MILLS);
return "I from callable";
}
});
while (true) {
/**
* 获得future对象之前可以使用isDone()方法检测future是否完成,完成后可以调用get()方法获得future的值,
* 如果直接调用get()方法,get()方法将阻塞值线程结束
*/
if (future.isDone()) {
try {
System.out.println(future.get());
break;
} catch (InterruptedException e) {
// ignored
} catch (ExecutionException e) {
// ignored
}
}
else {
try {
System.out.println("after " + sleepSeconds-- + " seconds, we will get future");
Thread.sleep(SECOND_MILLS);
} catch (InterruptedException e) {
// ignored
}
}
}
}
}
输出结果:
after 3 seconds, we will get future
after 2 seconds, we will get future
after 1 seconds, we will get future
I from callable
方法二:
在 run 方法方法中触发一些事件(如启动一个 Timer),再在让事件监听器函数返回那些被操作大的值
- COGS 68. [NOIP2005] 采药【01背包复习】
- UESTC 30 &&HDU 2544最短路【Floyd求解裸题】
- 我的第一个网页制作:Hello World!
- UESTC 1584 Washi与Sonochi的约定【树状数组裸题+排序】
- Hyperledger - 超级账本项目:简介,安装,案例
- 我的第三个网页制作:b、i、s、u、sub、sup标签的使用
- 【AlphaGo Zero 核心技术-深度强化学习教程代码实战04】Agent类和SARSA算法实现
- 我的第二个网页制作:p,hn,br标签的使用
- 超级账本项目:架构设计
- 我的第四个网页制作:列表标签
- “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码【A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博弈,J,差分dp
- 虎嗅主站盲打成功(已进后台)
- 我的第五个网页制作:pre、html转义、abbr标签的使用
- UVALive 3882 - And Then There Was One【约瑟夫问题】
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 因为两行代码,我差点被祭天......
- Web 云开发训练营总结 - 初阶
- 解密C语言编译背后的过程
- 知识卡片 反向传播中的梯度
- 网罗收集10046的各种Case,方便trace信息的收集 | Oracle官方博客转载
- 目标检测算法YOLO-V3结构详解
- 使用OPCache提升PHP的性能
- 克隆图
- LeetCode 03无重复字符的最长子串(滑动窗口)
- elasticSearch学习(五)
- MySQL进阶:索引与优化
- CentOS7搭建Zabbix4.2系统
- vue项目更换favicon.ico
- 一种O(n)的排序——计数排序引发的围观风波
- LeetCode 04寻找两个正序数组的中位数(困难)二分法