【并发编程】- 线程池执行Callable任务获取返回值

Callable带返回值接口使用 Callable带返回值接口使用 大厂面试题: 1、请你谈谈对volatile的理解? 2、CAS你知道吗? 3、原子类AtomicInteger的ABA问题谈谈?原子更新引用知道吗? 4、我们都知道ArrayList是线程不安全的,请编码写一个不安全的案例并给出解决方案? 5、公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁。 6、CountDownLatc... 阅读详情

Callable、Future使用

针对线程Thread对象不具有返回值的功能,但是有请求需要线程返回值,所以需要用到Callable和Future来让线程具有返回值的功能。
Callable接口与线程密不可分,但是和Runnable有以下主要的区别是

Callable接口的call()方法可以有返回值,而Runnable接口的run()方法没有返回值。

Callable接口的call()方法可以声明抛出异常,而Runnable接口的run()方法不可以声明抛出异常。
执行完Callable接口中的任务后,返回值是通过Future接口进行获取。

ThreadPoolExecutor使用submit提交Callable的任务

线程执行代码如下:

public class TheCallable implements Callable<String> {
    private int number;

    public TheCallable(int number){
        super();
        this.number=number;
    }

    @Override
    public String call() throws Exception {
        Thread.sleep(5000);
        return "返回值:"+number;
    }
}

运行类代码如下:

@Slf4j
public class CallableRun {
    public static void main(String[] args) {
        TheCallable theCallable = new TheCallable(18);
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 3, 10, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
        Future<String> future = threadPoolExecutor.submit(theCallable);
        try {
            log.info("开始时间:{}",System.currentTimeMillis());
            log.info("线程 "+future.get());
            log.info("结束时间:{}",System.currentTimeMillis());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

    }
}

运行结果如下:

17:09:57.944 [main] INFO com.ozx.concurrentprogram.executor.controller.CallableRun - 开始时间:1659344997940
17:10:02.942 [main] INFO com.ozx.concurrentprogram.executor.controller.CallableRun - 线程 返回值:18
17:10:02.943 [main] INFO com.ozx.concurrentprogram.executor.controller.CallableRun - 结束时间:1659345002943

从运行结果看出future调用get()是阻塞的,get()方法具有阻塞特性。
ExecutorService使用submit提交Runnable任务
方法submit()可以传入Callable对象,也可以传入Runnable对象,说明submit()方法支持有返回值和无返回值的功能。
运行类代码如下:

@Slf4j
public class RunnableRun {
    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
                log.info("Runnable 输出的内容:{}",simpleDateFormat.format(new Date()));
            }
        };

        ExecutorService executorService = Executors.newCachedThreadPool();
        Future future = executorService.submit(runnable);
        try {
            log.info("任务返回值:{},执行isDone方法结果:{}",future.get(),future.isDone());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

    }
}

运行结果如下:

17:31:37.704 [pool-1-thread-1] INFO com.ozx.concurrentprogram.executor.controller.RunnableRun - Runnable 输出的内容:17:31:37
17:31:37.715 [main] INFO com.ozx.concurrentprogram.executor.controller.RunnableRun - 任务返回值:null,执行isDone方法结果:true

从运行结果看出submit()方法传入Callable接口则有返回值,但是传入Runnable则无返回值,执行任务的返回值为null,之前验证过方法get()是具有阻塞特性,而isDone()方法是无阻塞特性。

【并发编程】(十九)Callable的实现原理简述 文章目录1.Callable概述1.1.Callable与Runable的区别1.2.Callable的使用2.实现原理简述2.1.Callable是如何被线程调度的2.2.返回值的获取2.3.阻塞的实现2.4.阻塞线程的唤醒3.Callble执行流程图 1.Callable概述 1.1.Callable与Runable的区别 Callable是一个用于定义多线程执行的代码逻辑的接口,里面定义了一个call()方法,类似于Runnable中的run()方法。子类实现了Callable接口后就可以重写call 阅读详情

相关推荐

java多线程(3):线程池的使用(结合Future/Callable使用)

博文

учёба 3417

线程实现方式Callable_获取线程的返回结果

继承Thread类实现Runnable接口实现Callable接口三种方式各有千秋,使用Thread方式实现简单,但是扩展性较差,因为Java是单继承方式,限制了他的发挥,此时可以使用Runnable方式实现,但是这两种方式都无法获取到线程的返回值,此时就可以使用Callable实现方式了。

qq_42251944的博客 1155

AI数字人:口播与唇形同步的福音,支持本地部署/批量生成/口齿清晰

你也可以直接输入语音,虚拟化身会根据语音的节奏和语调,同步做出相应的动作和表情,表现更加生动。不过这依然是个值得关注的工具。借助先进的 AI 算法,Heygem 高精度捕捉五官、轮廓等特征,构建逼真的虚拟模型。同时,它还能克隆语音,捕捉人声的细微特征,支持多种语音参数设置,打造高度相似的音色效果。打开设置,调整镜像存储位置,镜像文件比较大70~80G,选择合适的盘,设置完成后点击“Apply & Restart”。数字人视频画面与声音高度同步,口型匹配自然流畅,智能优化音视频效果,带来极佳的视听体验。

m0_72580657的博客 5862

Callable获取返回值

最近在写一个统计任务,恩,也不算最近了,过去一个多月了都。 任务要求,每周日凌晨之前统计用户总数及增长量,因为是分库分表的,统计维度要求到库级别和表级别。 大致实现思路,滚动时,每个表开一个线程做COUNT操作,因为要统计库级别的数据,所以需要等到所有线程结束后拿到所有线程的返回值,进行累加。(至于这里为什么滚动表的时候都要开一个线程,其实不开线程也OK的,但是,这种线程获取返回值的还没有用过...

sinat_24296421的博客 7695

C51单片机驱动ILI9341彩屏实战:从Proteus仿真到绘制自定义图案(附完整代码)

本文详细介绍了使用C51单片机驱动ILI9341彩屏的完整实战流程。内容涵盖硬件连接、8080并行接口时序模拟、寄存器初始化、屏幕方向设置以及基本图形绘制原理,并重点讲解了如何在Proteus仿真环境中搭建电路、调试代码,最终实现自定义图案的显示。文章提供了完整的代码示例,为嵌入式开发学习者和复古硬件爱好者提供了一套可行的解决方案。

rnn9storyteller的博客 511

从安装Eclipse 开始 开发第一个 CDS View

一篇超级简单快速的 创建CDS VIEW 入门步骤介绍文章。

IT小职员 4252

Java并发编程之线程池、Callable和Future使用

java并发编程中线程池、Callable使用说明

loongshawn的博客 6053

别再自己造轮子了!用MONAI Model Zoo里的预训练模型,5分钟搞定医学影像AI项目

本文介绍了如何利用MONAI Model Zoo中的预训练模型快速搭建医学影像AI项目,大幅节省开发时间和计算资源。通过实战案例展示了UNet、DenseNet121等核心模型的应用技巧,帮助临床医生和研究者5分钟内启动高质量医学影像分析,特别适合小样本场景下的病灶分割和分类任务。

weixin_33704234的博客 240

并发编程 05—— Callable和Future

Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭锁CountDownLatch 与 栅栏CyclicBarrier 并发编程 05—— Callable和Future 并发编程 06—— CompletionService : Exec...

LMAKE_nbsp的博客 248

告别代码丢失!用Git+Gitee管理你的Keil5单片机项目(保姆级图文教程)

本文详细介绍了如何利用Git和Gitee高效管理Keil5单片机项目,解决嵌入式开发中的代码丢失问题。通过精准配置.gitignore文件、设计适合团队的协作流程以及搭建安全备份体系,开发者可以轻松实现版本控制,提升工作效率。特别针对Keil工程的特殊文件类型,提供了实用的过滤规则和操作技巧。

weixin_33686714的博客 472

STM32Cube高效开发教程<高级篇><FreeRTOS>(一)-----FreeRTOS基础

一、 FreeRTOS概述声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。本专栏博客参考《STM32Cube高效开发教程(高级篇)》,有意向的读者可以购买正版书籍辅助学习,本书籍由王维波老师、鄢志丹老师、王钊老师倾力打造,书籍内容干货满满。写在前面:今天就算正式开始高级篇的博客编写了,我本人也是第一次学习FreeRTOS,所以整体的进度会比较慢,博客更新可能不太会及时,希望大家原谅。一、 FreeRTOS概述。

我的博客 1848

Callable,Future,ExecutorService的使用

参考:https://www.cnblogs.com/fengsehng/p/6048609.html  这篇博客介绍得很详细; Callable,简单来说,Callable就是我们以前写的Runnable,就是一个线程要执行的具体程序块,告诉线程要干什么相较于Runnable他可以使用泛型定义返回值,我们可以方便的获取到线程的执行结果; @Override public ThreeDMo...

qq_38742043的博客 557

JumpServer未授权访问漏洞 CVE-2023-42442

JumpServer 是全球首款完全开源的堡垒机, 使用GNU GPL v2.0 开源协议, 是符合4A 的专业运维审计系统。 JumpServer 使用Python / Django 进行开发。2021年1月15日,阿里云应急响应中心监控到开源堡垒机JumpServer发布更新,修复了一处远程命令执行漏洞。由于 JumpServer 某些接口未做授权限制,攻击者可构造恶意请求获取到日志文件获取敏感信息,或者执行相关API操作控制其中所有机器。

holyxp的博客 1426

Java8基础之Callable、Futrue、Executors和ExecutorService使用

1.查看Callable的api 2.查看Callable的接口中的方法 一个可以获取结果的执行的线程 3.查看Future接口的api 4.查看Future接口中的内容 用于获取执行后的结果的接口 5.查看Executors工具类的api 6.查看Executors中的方法 一个用于创建ExecutorService的工具类 7.查看ExecutorService的api 8.查看...

编程学习者的博客 1760

COMSOL有限元仿真深度指南:为结构件添加预应变

一、什么是预应力和预应变? 我们知道,结构力学问题中,结构件在外载荷作用下产生变形响应以吸收外载荷做功带来的能量;而在结构内部,整体的受力和变形则是通过固体微元的应力与应变传递的。 对于线弹性材料来说,应力与应变的关系可以线性表达,也即 σ=Dεσ = Dεσ=Dε ;在该式中,无论固体微元的应变程度多大,弹性矩阵DDD都是一个不变的常值。而对于超弹性材料来说,应力与应变的关系则需要通过应变能密度函数WWW来表征(详细参加博客《COMSOL有限元仿真深度指南:超弹性模型有限元分析入门》)。 从上面我们也不难

忘了面孔的Batou 7172

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

一文彻底搞懂:Runnable、Callable、Future、FutureTask 之间的关系

Java并发编程中的Runnable、Callable、Future和FutureTask详解:Runnable是最基础的任务接口,无返回值;Callable是其增强版,支持返回值和异常抛出。Future作为异步结果的凭证,提供任务状态查询和结果获取功能。FutureTask巧妙地将Runnable和Future结合,既能执行任务又能保存结果。线程池的submit()方法会自动将Callable包装成FutureTask执行。这套体系构成了Java异步任务处理的核心模型,FutureTask作为关键桥梁,支

Mark Wu 的博客 1650

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

50.安心技术梳理 - 线程池ExecutorService中【返回值】submit和【无返回值】execute的区别

一、创建任务 任务就是一个实现了Runnable接口的类。 创建的时候实run方法即可。 二、执行任务 通过java.util.concurrent.ExecutorService接口对象来执行任务,该接口对象通过工具类java.util.concurrent.Executors的静态方法来创建。 Executors此包中所定义的 Executor、ExecutorService、Sch...

majunzhu的博客 1391

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

java再复习-Future与Callable的使用

Future总是与Callable绑着使用的。 callable接口:相当于Runnable,但是被线程执行后可以提供返回值。 future接口:用来保存Callable的返回值的。 所以他俩是结合使用的 Future常用子类: FutureTask,一个保存Callable接口返回值的任务,使用: public class FutureAndCallableDemo { publ

Ade-rui的博客 503

Android并发编程之白话文详解Future,FutureTask和Callable

说到并发编程,就一定是多个线程并发执行任务。那么并发编程的基础是什么呢?没错那就是Thread了。一个Thread可以执行一个Runnable类型的对象。那么Runnable是什么呢?其实Runnable是一个接口,他只定义了一个方法run(),这个run()方法里就是我们要执行的任务,并且是要被Thread调用的。因此,一个Runnable就可以理解为一个要被执行的任务,而Thread就是一个执

阿拉灯神灯的专栏 1万+

JUC并发编程(七)-Thread与Callable之间的适配类FutureTask

7、Callable 线程创建方式 Thread、Runnable、Callable区别: 1、是否有返回值 Runnable 没有返回值,Callable有返回值 2、是否跑出异常 Runnable 没有异常,Callable有异常 3、方法不同, run(),call() Runnable 运行的方法是run,Callable运行的方法是call 7.1. Thread与Callable...

二总的猫 385

Java多线程系列--“JUC线程池”06之 Callable和Future

概要 本章介绍线程池中的Callable和Future。Callable 和 Future 简介示例和源码分析(基于JDK1.7.0_40) 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3544116.html Callable 和 Future 简介   Callable 和 Future 是比较有趣的一对组合。当我们需要获取线程的执...

weixin_30647065的博客 147

Java通过Callable实现多线程

import java.util.concurrent.*; import java.util.Date; import java.util.List; import java.util.ArrayList;public class Test { public static void main(String[] args) throws ExecutionException,Interrupt

王绍桦 4321

线程池ExecutorService的submit和execute

在Java5之后,并发线程这块发生了根本的变化,最重要的莫过于新的启动、调度、管理线程的一大堆API了。在Java5以后,通过 Executor来启动线程比用Thread的start()更好。在新特征中,可以很容易控制线程的启动、执行和关闭过程,还可以很容易使用线程池的特 性。   一、创建任务   任务就是一个实现了Runnable接口的类。 创建的时候实run方法即可。   二、

Happy_wu的专栏 783

ExecutorService实际上是一个线程池的管理工具

在Java5之后,并发线程这块发生了根本的变化,最重要的莫过于新的启动、调度、管理线程的一大堆API了。在Java5以后,通过Executor来启动线程比用 Thread的start()更好。在新特征中,可以很容易控制线程的启动、执行和关闭过程,还可以很容易使用线程池的特性。   一、创建任务   任务就是一个实现了Runnable接口的类。   创建的时候实run方法即可。   二、执行

CJQ316210的专栏 635

使用带返回值的多线程实例

1.创建线程池 ExecutorService executorService = Executors.newFixedThreadPool(10); 2.创建线程Callable Callable&lt;T&gt; callable = new Callable&lt;T&gt;() { @Override public ...

诚实可靠小郎君的博客 796

Callable和Future

Callable接口和Future接口

HOKING的专栏 440
上一篇: 【保姆级示例向】观察者模式
下一篇: Linux下 Alluxio 的编译和运行
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值