java终结方法_Java终结任务:Callable和Future

在这里首先介绍下Callable和Future,我们知道通常创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口,但是这两种方式创建的线程不返回结果,而Callable是和Runnable类似的接口定义,但是通过实现Callable接口创建的线程可以有返回值,返回值类型可以任意定义。

Callable接口

public interface Callable {

/**

* Computes a result, or throws an exception if unable to do so.

*

* @return computed result

* @throws Exception if unable to compute a result

*/

V call() throws Exception;

}

可以看到,这是一个泛型接口,call()函数返回的类型就是传递进来的V类型。

那么怎么使用Callable呢?一般情况下是配合ExecutorService来使用的,在ExecutorService接口中声明了若干个submit方法的重载版本:

Future submit(Callable task);

Future submit(Runnable task, T result);

Future> submit(Runnable task);

第一个submit方法里面的参数类型就是Callable。Callable一般是和ExecutorService配合来使用的,通过ExecutorService的实例submit得到Future对象。

Future

Future接口如下:

public interface Future {

boolean cancel(boolean mayInterruptIfRunning);// 试图取消对此任务的执行

boolean isCancelled(); // 如果在任务正常完成前将其取消,则返回true

boolean isDone(); // 如果任务已完成(不管是正常还是异常),则返回true

V get() throws InterruptedException, ExecutionException; // 方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回;

// 用来获取执行结果,如果在指定时间内,还没获取到结果,就直接返回null;

V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;

}

Future用于表示异步计算的结果。它的实现类是FutureTask。

如果不想分支线程阻塞主线程,又想取得分支线程的执行结果,就用FutureTask

FutureTask实现了RunnableFuture接口,这个接口的定义如下:

public interface RunnableFuture extends Runnable, Future

{

void run();

}

可以看出RunnableFuture继承了Runnable接口和Future接口,而FutureTask实现了RunnableFuture接口。所以它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值。

使用示例

package demo.future;

import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.*;

/**

* 试验 Java 的 Future 用法

*/

public class FutureTest {

public static class Task implements Callable {

@Override

public String call() throws Exception {

String tid = String.valueOf(Thread.currentThread().getId());

System.out.printf("Thread#%s : in call\n", tid);

return tid;

}

}

public static void main(String[] args) throws InterruptedException, ExecutionException {

List> results = new ArrayList>();

ExecutorService es = Executors.newCachedThreadPool();

for(int i=0; i<100;i++)

results.add(es.submit(new Task()));

for(Future res : results)

System.out.println(res.get());

}

}

终结任务

持有Future对象,可以调用cancel(),并因此可以使用它来中断某个特定任务,如果将ture传递给cancel(),那么它就会拥有该线程上调用interrupt()以停止这个线程的权限。因此,cancel()是一种中断由Executor启动的单个线程的方式。

cancel()一般是搭配get()方法来使用的。比方说,有一种设计模式是设定特定的时间,然后去执行一个作业的线程,如果该作业能够在设定的时间内执行完毕,则直接返回结果,如果不能执行完毕,则中断作业的执行,继续执行下一个作业,在这种模式下,使用Callable和Future来实现是一个非常好的解决方案。

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

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

相关文章

【youcans 的 OpenCV 例程200篇】196.图像的矩和不变矩(cv.moments)

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】196.图像的矩和不变矩&#xff08;cv.moments&#xff09; 2. 轮廓的特征描述 在对实际图像进行轮廓查找时&#xff0c;得到的轮廓数量很多。获取轮廓后&#xff0c;通常基于轮廓的特征进行筛选、识别和处…

Spring boot 项目目录结构详解

对SpringBoot项目目录进行分层显示能够使我们的开发思路更加的明确&#xff0c;代码内容更加清晰易懂&#xff0c;下面向大家讲解一下项目目录结构。 代码层的结构 根目录&#xff1a;com.springboot 1.工程启动类(ApplicationServer.java)置于com.springboot.build包下 2.实…

【youcans 的 OpenCV 例程200篇】197.轮廓的基本特征

OpenCV 例程200篇 总目录-202205更新 文章目录【youcans 的 OpenCV 例程200篇】197.轮廓的基本特征2. 轮廓的特征描述2.2 轮廓的面积、周长、质心和近似多边形2.2.1 轮廓的面积2.2.2 轮廓的周长2.2.3 轮廓的质心2.2.4 轮廓的近似2.2.5 轮廓的凸包&#xff08;凸壳&#xff09;例…

Idea 项目导入

我们在刚开始使用新的开发工具IDEA的时候会遇到我们想要导入一个外部项目却不知从何下手&#xff0c;下面我就教给大家如何使用IDEA导入一个外部的项目。 Idea 导入 外部项目 1.点击 file — new 2.打开路径地址&#xff0c;选择需要导入的项目 3.选择创建—next 4.默认—…

【youcans 的 OpenCV 例程200篇】198.基于不变矩的形状相似性检测

OpenCV 例程200篇 总目录-202206更新 【youcans 的 OpenCV 例程200篇】198.基于不变矩的形状相似性检测 3. 基于不变矩检测的图像识别 形状匹配也称为形状相似度检测&#xff0c;用于比较两个形状或两个轮廓。 函数 cv2.matchShapes() 基于 Hu 不变矩检测两个形状之间的相似度…

spring boot 如何修改默认端口号和context path

创建了SpringBoot项目之后进行运行&#xff0c;当我们需要使用游览器进行访问的时候要输入端口号&#xff0c;那麽我们如何来修改这个端口号呢&#xff1f;&#xff1f;&#xff1f; 1.在src/main/resources目录下新建文件application.properties&#xff0c;并进行配置,来重写…

【youcans 的 OpenCV 例程200篇】199.轮廓的外接边界框

OpenCV 例程200篇 总目录-202206更新 【youcans 的 OpenCV 例程200篇】199.轮廓的外接边界框 文章目录【youcans 的 OpenCV 例程200篇】199.轮廓的外接边界框2. 轮廓的特征描述2.3 轮廓的外接边界框2.3.1 轮廓的垂直矩形边界框2.3.2 轮廓的最小矩形边界框2.3.3 轮廓的最小外接圆…

单级联动

想要实现联动的效果首先我们要知道什么是单机联动&#xff0c;所谓的单级联动就是点击输入框的时候&#xff0c;下面会出现多个单级联动的列表供你选择自己所要选择的数据。 我们使用html写主题内容&#xff0c;使用CSS添加样式&#xff0c;使用Jquery实现联动等相关的事件和效…

【youcans 的 OpenCV 例程200篇】200.轮廓的基本属性

OpenCV 例程200篇 总目录-202206更新 文章目录【youcans 的 OpenCV 例程200篇】200.轮廓的基本属性2.4 轮廓的基本属性2.4.1 轮廓的宽高比&#xff08;Aspect Ratio&#xff09;2.4.2 轮廓的面积比&#xff08;Extent&#xff09;2.4.3 轮廓的坚实度&#xff08;Solidity&#…

mysql c api example_The MySQL C API 编程实例

在网上找了一些MYSQL C API编程的文章&#xff0c;看了后认为还是写的不够充分&#xff0c;依据自己经验写了这篇《The MySQL C API 编程实例》&#xff0c;希望对须要调用到MYSQL的C的API的朋友有所帮助&#xff0c;附例中的环境为RedHat在这篇文章里&#xff0c;我们将学会怎…

【youcans 的 OpenCV 例程200篇】结束语

【youcans 的 OpenCV 例程200篇】总目录 【youcans 的 OpenCV 例程200篇】结束语 【youcans 的 OpenCV 例程】真的写到了 200篇&#xff0c;迎来了“结束语”。 本系列原名【OpenCV 例程 100篇】&#xff0c;从 2021年 11月开始写作&#xff0c;原计划每天写一篇&#xff0c;写…

java aspose 导出word_使用aspose.word 第三方的插件实现导出word

#region 生成的excel文件命名和确保文件的唯一性Random rd new Random();DateTime dtime DateTime.Now;string Filename "培训需求表" dtime.Year.ToString() dtime.Month.ToString() dtime.Day.ToString() dtime.Hour.ToString() dtime.Minute.ToString() …

智能家居(1)行业发展分析

1 智能家居系统 智能家居是基于物联网技术&#xff0c;由硬件系统、软件系统、云计算平台构成一个家庭生态圈&#xff0c;为用户提供安全、便利、舒适的家居生活环境。 具体而言&#xff0c;智能家居以住宅为单位、以家庭生活为背景&#xff0c;以综合布线技术、网络通信技术…

redis 高级实用教程

一、设置redis外网访问 更改redis.conf 文件 # vim redis.conf bind 127.0.0.1 # 注释掉改行 protected-mode yes # 更改模式为no&#xff08;redis3.2后&#xff09;二、设置密码验证 更改redis.conf配置文件 requirepass redhat或者通过set设置 127.0.0.1:6284>…

java学到哪里最容易蒙,蒙哥比vs蒙克(目前最好的哪个)

Im planning to integrate mongodb based migration tool in my spring boot application which is having spring-data dependency in project. I found main two libraries 1) Mongobee 2) Mongock.I need some feedback which one should i choose ? Thanks in advance!解决…

LaTex实战笔记 4-插入 Python 程序代码块

LaTex插入 Python 程序代码块1. 需求描述和解决方案2. minted 包的安装与配置2.1 安装 Python 第三方库 Pygments2.2 下载和安装 minted 宏包2.3 配置 LaTeX 编译环境3. minted 包的使用3.1 基本使用3.2 扩展使用3.2.1 \mint 命令行3.2.2 \mintinline 行内使用3.2.3 \inputmint…

Redis 安装与配置

Redis 安装与配置 Window 下安装 下载地址&#xff1a;https://github.com/MSOpenTech/redis/releases。 这里我们下载 Redis-x64-xxx.zip 解压到指定目录&#xff1a;  打开命令行&#xff08;cmd&#xff09;跳转至解压路径,并运行安装命令&#xff0c;结果如图 C:\U…

智能家居(2)智能体验与智能交互

1. 智能体验的分析与讨论 随着信息和网络技术的发展&#xff0c;可以网络连接的电子电器产品越来越丰富&#xff0c;智能家居、智慧园区、智能汽车等智能控制系统和产品应用越来越广泛。 智能交互终端是智能控制系统的人机交互接口&#xff0c;既是实现智能功能的重要载体&am…

netbeans java9_Java 开发新选择?Apache NetBeans IDE 9.0 备受好评

Apache NetBeans 9.0 目前已发布 Beta 版本&#xff0c;离正式版本越来越近。9.0 版本的主要目标囊括 Oracle 捐赠的大量代码&#xff0c;以及提供 Java 9 和 10 支持。Apache NetBeans 近期在社区上发起了一项满意度调查&#xff0c;用于验收用户如何对 9.0 版本的看法&#x…

LaTex实战笔记 1-快速入门

LaTex插入 Python 程序代码块1. 为什么用 LaTeX&#xff1f;2. LaTeX 的安装与配置2.1 安装 TeXLive2.2 选择 LaTeX 编辑器3. LaTeX 的初次使用3.1 最短的 LaTeX 示例3.2 从模板创建文档3.3 编译生成 PDF 文件4. 基于模板编辑文档4.1 tex 模板的基本结构4.2 基于模板编辑排版5.…