使用Callable和FutureTask使用多线程

2024-05-04 01:58

本文主要是介绍使用Callable和FutureTask使用多线程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用Callable接口封装任务可以获得任务执行后的结果。它的接口定义比较简单,里面有一个call()方法,和Runnable接口里面的run()方法基本一样,可以看到,Callable接口是在util.concurrent多线程包下的类,它的返回值是一个泛型。

package java.util.concurrent;
@FunctionalInterface
public interface Callable<V> {V call() throws Exception;
}

Future接口也是在多线程包下的一个接口,这个接口用于封装多线程异步执行的结果,它有下面几个方法。

package java.util.concurrent;
public interface Future<V> {boolean cancel(boolean mayInterruptIfRunning);boolean isCancelled();boolean isDone();V get() throws InterruptedException, ExecutionException;V get(long timeout, TimeUnit unit)throws InterruptedException, ExecutionException, TimeoutException;
}

方法boolean cancel(boolean mayInterruptIfRunning),这个方法根据传入的参数来决定对当前任务进行取消的操作,传入true,代表取消掉当前正在执行但是还未执行完毕的的子任务,传入false代表不取消当前执行的子任务,返回值代表当前是否被成功取消。

方法boolean isCancelled() 可以用来获取当前子任务的状态:是否被取消。

方法boolean isDone() 用来判断当前线程任务是否执行完毕。

方法V get() 用来获取当前执行的子线程任务返回的结果,如果线程还未执行完则进入阻塞等待结果,如果执行过程中出现异常或者被中断,则会抛出对应的异常。

V get(long timeout, TimeUnit unit) 可以设置时间限制的get(),一定的时间下如果还未获取到线程执行的结果则会抛出超时的异常。

看一看FutureTask的继承关系

FutureTask implements RunnableFuture
RunnableFuture extends Runnable, Future

可以看到 RunnableFuture是Runnable和Future组合,当创建一个FutureTask对象时,要传入一个实现了Callable 接口的子任务,FutureTask包装了子任务,然后丢给Thread或者线程池去执行当前封装的任务。

测试代码

/*** 测试多线程FutureTask下获取返回值得小Demo*/
public class MutipleThread {public static void main(String[] args) throws ExecutionException, InterruptedException {FutureTask futureTask = new FutureTask<String>(new Callable<String>() {@Overridepublic String call() throws Exception {return "这个是返回值";}});futureTask.run();System.out.println((String) futureTask.get());}
}

这篇关于使用Callable和FutureTask使用多线程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

MySQL 衍生表(Derived Tables)的使用

《MySQL衍生表(DerivedTables)的使用》本文主要介绍了MySQL衍生表(DerivedTables)的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学... 目录一、衍生表简介1.1 衍生表基本用法1.2 自定义列名1.3 衍生表的局限在SQL的查询语句select

Mybatis Plus Join使用方法示例详解

《MybatisPlusJoin使用方法示例详解》:本文主要介绍MybatisPlusJoin使用方法示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录1、pom文件2、yaml配置文件3、分页插件4、示例代码:5、测试代码6、和PageHelper结合6

MySQL分区表的具体使用

《MySQL分区表的具体使用》MySQL分区表通过规则将数据分至不同物理存储,提升管理与查询效率,本文主要介绍了MySQL分区表的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、分区的类型1. Range partition(范围分区)2. List partition(列表分区)3. H

使用SpringBoot整合Sharding Sphere实现数据脱敏的示例

《使用SpringBoot整合ShardingSphere实现数据脱敏的示例》ApacheShardingSphere数据脱敏模块,通过SQL拦截与改写实现敏感信息加密存储,解决手动处理繁琐及系统改... 目录痛点一:痛点二:脱敏配置Quick Start——Spring 显示配置:1.引入依赖2.创建脱敏

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

Go语言中Recover机制的使用

《Go语言中Recover机制的使用》Go语言的recover机制通过defer函数捕获panic,实现异常恢复与程序稳定性,具有一定的参考价值,感兴趣的可以了解一下... 目录引言Recover 的基本概念基本代码示例简单的 Recover 示例嵌套函数中的 Recover项目场景中的应用Web 服务器中

CnPlugin是PL/SQL Developer工具插件使用教程

《CnPlugin是PL/SQLDeveloper工具插件使用教程》:本文主要介绍CnPlugin是PL/SQLDeveloper工具插件使用教程,具有很好的参考价值,希望对大家有所帮助,如有错... 目录PL/SQL Developer工具插件使用安装拷贝文件配置总结PL/SQL Developer工具插

SpringBoot3中使用虚拟线程的完整步骤

《SpringBoot3中使用虚拟线程的完整步骤》在SpringBoot3中使用Java21+的虚拟线程(VirtualThreads)可以显著提升I/O密集型应用的并发能力,这篇文章为大家介绍了详细... 目录1. 环境准备2. 配置虚拟线程方式一:全局启用虚拟线程(Tomcat/Jetty)方式二:异步

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

使用Python实现获取屏幕像素颜色值

《使用Python实现获取屏幕像素颜色值》这篇文章主要为大家详细介绍了如何使用Python实现获取屏幕像素颜色值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、一个小工具,按住F10键,颜色值会跟着显示。完整代码import tkinter as tkimport pyau