Java中使用有返回值的线程

在创建多线程程序的时候,我们常实现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()方法将阻塞到线程结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556795.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis 插入时获取主键的方式

mybatis 作为一个主流的 ORM 框架&#xff0c;深受广大开发者的喜爱。有人的地方就有江湖&#xff0c;有代码的地方自然有坑&#xff0c;下面来说说获取 mybatis 的插入后返回的主键。 我们可以想一下自动增长的主键特性&#xff0c;在数据库里面肯定有某个地方管理 ID 的自增…

linux脚本怎么把文件地址变成动态地址,Linux脚本程序自动修改网卡配置文件中的MAC地址...

在玩Linux虚拟机的时候&#xff0c;一个安装好linux系统的virtual HDD会用于创建多个虚拟机&#xff0c;这样就不需要在创建每个虚拟机都安装一遍系统了。virtual HDD加载到虚拟机后&#xff0c;新的虚拟机的MAC地址就会和virtual系统中ifcfg-eth[0&#xff0d;9]中的MAC地址不…

MySQL + MyBatis 批量插入时存在则忽略或更新记录

一、存在时则忽略 为什么在发现重复时会忽略&#xff1f;这里面涉及到两个地方。 1、重复则忽略。那么首先是需要判断是否重复&#xff0c;这里是通过唯一索引判断是否重复的。如果表中唯一索引的字段已经存在与将要插入的记录行中唯一索引的字段值相同&#xff0c;则标识为重…

Linux 目录所属组设置,Linux系统用户与组管理命令及配置文件总结

一、Linux系统用户及组分类1、用户类别Linux系统中的用户大致可分为三类&#xff1a;root用户、系统用户、普通用户。每一个用户都拥有一个唯一的身份标识UID。2、组分类与用户信息对应的&#xff0c;Linux系统中的组也可分为三类&#xff1a;root组、系统组、普通组。每一个组…

linux 字符串 空,linux – bash空字符串/命令

你似乎把bash与其他一些编程语言混淆了.变量被替换,然后左边的内容被执行."$a"这是引号之间的a的内容. a是空的,所以这相当于&#xff1a;""那不是命令. “没有找到指令.”由于存在错误,执行不成功(shell返回代码不为0),因此命令的后半部分 – && …

@GetMapping和@PostMapping详解

首先要了解一下RequestMapping注解。 RequestMapping用于映射url到控制器类的一个特定处理程序方法。可用于方法或者类上面。也就是可以通过url找到对应的方法。 RequestMapping有8个属性。 value&#xff1a;指定请求的实际地址。 method&#xff1a;指定请求的method类型&…

实验楼 linux内核原理与分析,《Linux内核原理与分析》第一周作业 20189210

实验一 Linux系统简介这一节主要学习了Linux的历史&#xff0c;Linux有关的重要人物以及学习Linux的方法&#xff0c;Linux和Windows的区别。其中学到了LInux中的应用程序大都为开源自由的软件&#xff0c;用户可以修改定制再发布&#xff1b;内核是实现多任务运行和硬件管理的…

MySQL的INSERT INTO··· ON DUPLICATE KEY UPDATE使用的几种情况

保存或更新 在MySQL数据库中&#xff0c;如果在insert语句后面带上ON DUPLICATE KEY UPDATE 子句&#xff0c;而要插入的行与表中现有记录的惟一索引或主键中产生重复值&#xff0c;那么就会发生旧行的更新&#xff1b;如果插入的行数据与现有表中记录的唯一索引或者主键不重复…

linux svn 指定端口号,linux(Ubuntu)搭建Subversion服务器+修改svn端口号

一、搭建 Subversion 服务器1、首先需要安装 subversion 这个软件&#xff1a;sudo apt-get install subversion注&#xff1a;使用apt-get安装软件&#xff0c;ubuntu默认将软件下载到 /etc/bash_completion.d/ 目录下&#xff0c;可使用 sudo apt-get source packagename 下载…

java8 Stream API详解

文章目录一、Stream流概述二、创建Stream的方式相关API三、Stream的中间操作筛选与切片映射排序四、终止操作第一大类API&#xff08;太过简单&#xff09;第二大类AP归约收集一、Stream流概述 1、java8中有两大最为重要的改变&#xff0c;第一就是Lambda表达式&#xff0c;另…

linux实验3编写内核模块,实验2.3_内核模块_实验报告

实验报告题目: 内核模块实验1、实验目的模块是Linux系统的一种特有机制&#xff0c;可用以动态扩展操作系统内核功能。编写实现某些特定功能的模块&#xff0c;将其作为内核的一部分在管态下运行。本实验通过内核模块编程在/porc文件系统中实现系统时钟的读操作接口。2、实验内…

Java 8 Stream Api 中的 peek、map、foreach区别

#1. 前言 我在Java8 Stream中讲述了 Java 8 Stream API 的一些内容。今天再看一下peek、map、foreach区别。 2. peek peek 操作接收的是一个 Consumer 函数。顾名思义 peek 操作会按照 Consumer 函数提供的逻辑去消费流中的每一个元素&#xff0c;同时有可能改变元素内部的一…

linux驱动日志格式,( 转)嵌入式Linux驱动Makefile

天气: 晴朗心情: 高兴( 转)嵌入式Linux驱动开发笔记1.1 模块的编译Linux驱动一般以模块module的形式来加载&#xff0c;首先需要把驱动编译成模块的形式。简单的例子&#xff0c;Begin of hello.c file#include #include #include static int __init test_init(void){pr…

Java 8 Stream 流用法及语法

Java 8 Stream 流用法 1.简介 Stream流 最全的用法 Stream 能用来干什么&#xff1f;用来处理集合&#xff0c;通过 使用Stream API 对集合数据进行操作&#xff0c;就类似于使用 SQL 执行的数据库查询&#xff0c;Stream API 提供了一种高效且易于使用的处理数据的方式 为什…

wapper打成linux服务,Wrapper配置详解及高级应用(转)

转自&#xff1a;http://286.iteye.com/blog/1921414将一个简单的程度如HelloWorld 的应用包装秤Wrapper 服务并不复杂&#xff0c;甚至可以认为非常简单。但是实际项目应用过程中我们的程序一般较庞大&#xff0c;运行环境也较复杂。通过Wrapper 配置文件的分析与配置进一步了…

Java8 Stream 流机制和 Lambda 表达式

一、Stream 流介绍与使用场景 Stream 流介绍 java8 中的stream 与InputStream和OutputStream是完全不同的概念, stream 是用于对集合迭代器的增强&#xff0c;使之完成能够完成更高效的聚合操作&#xff08;过滤、排序、统计分组&#xff09;或者大批量数据操作。stream 与 L…

嵌入式linux安装qt,树莓派上安装qt

在树莓派上安装了官方的raspbian系统。为了在能在上面开发程序&#xff0c;在系统上安装了qt4 。参考链接http://qt-project.org/wiki/apt-get_Qt4_on_the_Raspberry_Piapt-getFirstly I got the development tools needed by Qt Creator in the hope it would be less heavy f…

linux guide编译器,GUIDE编译器-GUIDE编程工具-GUIDE编译器下载 v1.0.2官方版-完美下载...

GUIDE编译器是款跨平台的开发环境编程工具&#xff0c;支持C/C 和 Pascal三种语言&#xff0c;具有跨平台、操作简单、跨编程语言和单文件编译调试等特点&#xff0c;为用户提供单文件编译、调试和运行的环境。GUIDE编译器特色1、跨平台&#xff1a; GUIDE 可在 linux 平台和 w…

MySQL事务隔离级别和实现原理

经常提到数据库的事务&#xff0c;那你知道数据库还有事务隔离的说法吗&#xff0c;事务隔离还有隔离级别&#xff0c;那什么是事务隔离&#xff0c;隔离级别又是什么呢&#xff1f;本文就帮大家梳理一下。 MySQL 事务 本文所说的 MySQL 事务都是指在 InnoDB 引擎下&#xff0…

Linux如何清除last信息,linux清除last、lastb和history记录

清除登录系统成功的记录&#xff0c;也就是last命令看到的记录[rootlocalhost root]# echo ""> /var/log/wtmp 此文件默认打开时乱码的&#xff0c;里面可以看到ip等等信息[rootlocalhost root]# echo "">/var/log/wtmp[rootlocalhost root]# last此…