ThreadPoolExecutor使用submit方法提交Runnable任务定义执行结果的返回值类型

ThreadPoolTaskExecutor实现多线程并处理返回值 这篇文章主要记录一下有返回值的多线程该怎么实现。 之前的文章有提到过ThreadPoolTaskExecutor线程池执行任务有几个方法: executor.execute(Runnable task):完美适用于没有返回值的情况。未捕获的异常会抛出 executor.submit(Runnable task):也适用于没返回值的情况,未捕获的异常不会抛出 executor.submit(... 阅读详情

ThreadPoolExecutor使用submit方法提交Runnable任务规定执行结果的返回值

实体类代码如下:

@Data
public class User {
    private String username;
    private String password;
}

线程执行代码如下:

public class ThirdRunnable implements Runnable {

    private User user;

    public ThirdRunnable(User user){
        super();
        this.user=user;
    }

    @Override
    public void run() {
        user.setUsername("Gxin");
        user.setPassword("20220802");
    }

}

运行类代码如下:

@Slf4j
public class NotGetRun {
    public static void main(String[] args) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
        User user = new User();
        ThirdRunnable thirdRunnable = new ThirdRunnable(user);
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 6, 10, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
        Future<User> userFuture = threadPoolExecutor.submit(thirdRunnable, user);
        log.info("开始时间:{}",simpleDateFormat.format(new Date()));
        try {
            User info = userFuture.get();
            log.info("future 获取到的账号:{},密码:{}",info.getUsername(),info.getPassword());
            log.info("结束时间:{}",simpleDateFormat.format(new Date()));
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

    }
}

运行结果如下:
17:27:50.832 [main] INFO com.ozx.concurrentprogram.executor.controller.NotGetRun - 开始时间:17:27:50
17:27:50.846 [main] INFO com.ozx.concurrentprogram.executor.controller.NotGetRun - future 获取到的账号:Gxin,密码:20220802
17:27:50.846 [main] INFO com.ozx.concurrentprogram.executor.controller.NotGetRun - 结束时间:17:27:50
从运行结果看出线程池执行Runnable任务,可以获取任务中返回的对象的相关值,而Callable任务实现Callable接口时,就指定返回值的类型,Runnable任务的返回值类型可以通过方法submit(Runnable r,T result)的第2个参数进行设置,result可作为执行结果的返回值类型,而不需要使用get()方法来进行获得。

使用方法cancel(boolean mayInterruptIfRunning)和isCancelled()

方法cancel(boolean mayInterruptIfRunning)的参数mayInterruptIfRunning的作用是如果线程正在运行则是否中断正在运行的线程,在代码中需要使用if(Thread currentThread().isInterrupted())进行配合使用。
方法cancel()的返回值代表发送取消任务的命令是否成功完成。
线程执行代码如下:

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 CancelCallableRun {
    public static void main(String[] args) {
        TheCallable theCallable = new TheCallable(20220804);
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 3, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
        Future<String> future = threadPoolExecutor.submit(theCallable);
        try {
            String result = future.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        log.info("取消任务结果:{},发送取消任务的命令执行结果:{}",future.cancel(true),future.isCancelled());
    }
}

运行结果如下:
17:59:36.426 [main] INFO com.ozx.concurrentprogram.executor.controller.CancelCallableRun - 取消任务结果:false,发送取消任务的命令执行结果:false

ThreadPoolExecutor的中的submit和FutureTask || 通过Executors 创建线程池的一些实例(Callable和Runnable的在其中的体现) 线程的创建方式,Callable接口和Future接口的配合,Runnable任务、Callable任务提交到线程池,他们之间的区别 阅读详情

相关推荐

Callable与Runnable

/** Callable与Runnable功能相似,Callable的call有返回值 可以返回给客户端,而Runnable没有返回值,一般情况下,Callable 与FutureTask一起使用,或者通过线程池的submit方法返回相应的Future Future就是对于具体的Runnable或者Callable任务的执行结果进行取消, 查询是否完成,获取结果,设置结果操作。get方法会阻塞...

weixin_36330410的博客 1038

ThreadPoolExecutor中的submit()方法详细讲解

ThreadPoolExecutor中的submit()方法详细讲解在使用线程池的时候,发现除了execute()方法可以执行任务外,还发现有一个方法submit()可以执行任务。submit()有3个参数不一的方法,这些方法都是在ExecutorService接口中声明的,在AbstractExecutorService中实现,而ThreadPoolExecutor继承AbstractExecut

Widsom的博客 8万+

Python多线程ThreadPool传入多个参数并获取方法返回值

使用ThreadPoolExecutor可以方便地创建和管理线程池,并传入多个参数给线程的执行函数,并获取其返回值。Python提供了ThreadPoolExecutor类,可以方便地创建和管理线程池,并可以传入多个参数给线程的执行函数,并获取其返回值。通过上述代码,我们可以使用ThreadPoolExecutor传入多个参数给线程的执行函数,并获取其返回值。然而,需要注意的是,在使用多线程处理大数据时,还需要考虑线程安全和资源竞争的问题,避免出现数据错误和死锁等情况。

JieLun_C的博客 1166

13.ThreadPoolExecutor线程池之submit方法

jdk1.7.0_79    在上一篇《ThreadPoolExecutor线程池原理及其execute方法》中提到了线程池ThreadPoolExecutor的原理以及它的execute方法。本文解析ThreadPoolExecutor#submit。   对于一个任务的执行有时我们不需要它返回结果,但是有我们需要它的返回执行结果。对于线程来讲,如果不需要它返回结果则实现Runnable,而...

weixin_33754913的博客 827

模型量化必知:Per-Tensor和Per-Channel到底怎么选?

本文深入解析了模型量化中Per-Tensor与Per-Channel两种核心策略的抉择。Per-Tensor量化实现简单、硬件兼容性极佳,适合激活值或分布均匀的权重;而Per-Channel量化精度更高,能更好地处理权重分布不均的卷积层,是现代CNN权重量化的主流。文章提供了从硬件平台、数值分布到精度需求的实战决策框架,并推荐了“权重Per-Channel,激活Per-Tensor”的混合量化最佳实践。

assembly8low的博客 983

CST仿真实例001:圆极化平板天线仿真

CST仿真实例001:圆极化平板天线仿真实例

weixin_47638568的博客 1万+

ThreadPoolExecutor的execute()和submit()方法

我希望使用多线程执行一个运算,并且线程执行完毕后我要获取执行结果。其实使用线程池ThreadPoolExecutor的execute()和submit()方法都可以。 使用execute()的话,事先定义一个存放返回结果的集合,开辟线程时,将集合的元素作为参数代入自定义的Runnable接口的实现类中,多线程执行完毕后遍历集合即可获得运算结果。 使用submit()的话,可以在submit()...

m0_37822338的博客 1万+

搭建Dzzoffice 教程

通过以上步骤,您已经成功配置了WEB环境,安装了DzzOffice,并完成了系统设置和应用安装。1.安装包的设置默认是系统盘之外的第二个盘,没有其他盘符的时候则安装在C盘,当主机盘符只有C盘可用的时候,安装时不要使用U盘,否则可能误装到U盘当中。4.如果之前已经安装,再次安装时请确保上次安装已经卸载或者所有文件可读,否则请备份文件,卸载之后再安装。在其他安装环境中,我没有相关的使用经验。3. 保证安装路径是纯净的,安装路径下不能有已安装的V8版本,若重新安装,请选择其它路径。

小胡的博客 4950

ThreadPoolExecutor线程池之submit方法

 对于一个任务的执行有时我们不需要它返回结果,但是有我们需要它的返回执行结果。对于线程来讲,如果不需要它返回结果则实现Runnable,而如果需要执行结果的话则可以实现Callable。在线程池同样execute提供一个不需要返回结果的任务执行,而对于需要结果返回的则可调用其submit方法。   回顾ThreadPoolExecutor的继承关系。      在Executor接口中只定义...

woailuo23的博客 3936

蓝牙HCI Dongle实战:从芯片选型到协议栈集成的完整指南

本文详细介绍了蓝牙HCI Dongle的实战应用,从芯片选型到协议栈集成的完整指南。通过对比CSR8510、nRF52840等主流芯片的性能和价格,提供选型建议和避坑技巧。同时,深入解析Zephyr协议栈移植和常见问题排查,帮助开发者高效完成蓝牙项目开发。

weixin_30786657的博客 322

YOLOv11改进 | 主干/Backbone篇 | 利用目标检测轻量化网络MobileNetV2替换Backbone(yolov11系列全系轻量化)

本文给大家带来的改进机制是,其是专为移动和嵌入式视觉应用设计的轻量化网络结构。其在MobilNetV1的基础上采用反转残差结构和线性瓶颈层。这种结构通过轻量级的深度卷积和线性卷积过滤特征,同时去除狭窄层中的非线性,以维持表征能力。MobileNetV2在性能上和精度上都要比V1版本强很多,其在多种应用(如对象检测、细粒度分类、面部属性识别和大规模地理定位)中都展现了一定的有效性。YOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备目录一、本文介绍二、MobileNetV2的框架原理。

Snu77的博客 2843

java线程池ThreadPoolExecutor通过submit提交runnable的task时,为何不会抛出oom

show me the code import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadLocalOomTest { public static void main(String[] args) { ExecutorSe...

水中加点糖 3802

C-08-实战:搭建一个AI客服机器人(接入微信企微)

客服是一人公司最大的时间杀手。本文教你搭建一个AI客服机器人,能自动回答80%的常见问题,只把复杂问题转给人工。含微信公众号和企业微信接入完整代码。

Johnny2004的专栏 88

线程池ThreadPoolExecutor中submit方法和execute方法的区别和关系

ThreadPoolExecutor是线程池,其继承AbstractExecutorService,如下代码: package java.util.concurrent; import java.util.ArrayList; import java.util.ConcurrentModificationException; import java.util.HashSet; import ...

任枫的博客 4055

小米15修复“NV损坏” 去除主板校验电阻步骤解析与图示

小米15系列将搭载骁龙8至尊版处理器,采用台积电3nm工艺。文章分析了手机出现"NV损坏"故障的表现及修复方法,包括通信异常、系统启动问题等典型症状,并介绍了去除主板校验电阻和刷写工程固件两种修复方案。重点讲解了去除主板电阻后刷写QCN文件的操作流程,强调在维修过程中需要结合分析与思考。适用于小米15系列特定机型(24129PN74G/I/C)的硬件修复。

小马哥的专栏 313

【占用网络】OccNet: Scene as Occupancy 适用于检测、分割和规划任务 ICCV2023

本文分享“占用网络”方案中,具有代表性的方法:OccNet。它以多视角视觉为核心,首先生成BEV特征,然后通过级联结构和时间体素解码器重建生成3D占用特征。构建一个通用的“3D占用编码特征”,用以表示3D物理世界。这样的特征描述可以应用于广泛的自动驾驶任务,包括检测、分割和规划。

黎国溥 3360

Future获取任务返回值

Future获取任务返回值 submit方法签名 在向线程池ThreadPoolExecutor提交任务时,一般为了方便操作采用execute提交任务,这时线程其实是无返回值的,但是在生产中为了应对各种各样的需求,获取线程返回值是必不可少的,所以SDK提供另一种任务提交方式submit,方法签名如下 // 提交Runnable任务 Future<?> submit(Runnable task); // 提交Callable任务 <T> Future<T> submit(C

zzf1233的博客 5311

OV9734 DATASHEET,完整规格书

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

ThreadPoolExecutor线程池submit() 和 excute()区别,顺便带上Runnable和Callable

1、 实现Runnable接口和Callable接口的区别 如果想让线程池执行任务的话需要实现的Runnable接口或Callable接口。 Runnable接口或Callable接口实现类都可 以被ThreadPoolExecutor或ScheduledThreadPoolExecutor执行。 两者的区别一: 在于 Runnable 接口不会返回结果但 是 Callable 接口可以返回...

yuan_qh的博客 2497

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

java threadpoolexecutor 返回值_简单谈谈ThreadPoolExecutor线程池之submit方法

jdk1.7.0_79在上一篇《ThreadPoolExecutor线程池原理及其execute方法》中提到了线程池ThreadPoolExecutor的原理以及它的execute方法。本文解析ThreadPoolExecutor#submit。对于一个任务的执行有时我们不需要它返回结果,但是有我们需要它的返回执行结果。对于线程来讲,如果不需要它返回结果则实现Runnable,而如果需要执行结果的...

weixin_33826761的博客 949

android 蓝牙通讯demo

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

Java多线程之自定义线程池(ThreadPoolExecutor执行submit返回值Future)

一般使用线程池执行任务都是调用的execute方法,这个方法定义在Executor接口中: public interface Executor { void execute(Runnable command); } 这个方法是没有返回值的,而且只接受Runnable。 那么像得到线程的返回值怎嘛办呢? 在ExecutorService接口中能找到这个方法: <T&gt...

smilehappiness的博客 1712

线程池ThreadPoolExecutor的execute和submit方法在程执行发生异常会怎么样

本文章是通过源码介绍ThreadPoolExecutor 两种提交线程的方式,在线程执行异常,线程池的处理方式

wyz0923的博客 781

ThreadPoolExecutor中submit()与Executor()方法区别

本文主要是记录一下自己看了ThreadPoolExecutor的源码后的一个大体理解,方便以后的复习,文中如果有什么错误的地方还请各位大佬们指出,万分感谢!!! 本文主要描述一下ThreadPoolExecutor中submit()与Executor()方法区别,想了解ThreadPoolExecutor的整体的逻辑看一下我的另一篇文档ThreadPoolExecutoru源码分析。 首先,Executor()方法是在Executor接口中定定义的,submit()方法定义在ExecutorServic

fz11zf的博客 3269

ThreadPoolExecutor submit和execute方法的区别

可以看到 异常被放到 FutureTask 中 ,只有在 调用 get 方法的时候才会被抛出。

面朝大海,春暖花开 3650

Java多线程-线程池ThreadPoolExecutor的submit返回值Future

起原文地址 http://blog.youkuaiyun.com/qq_25806863/article/details/71214033一般使用线程池执行任务都是调用的execute方法,这个方法定义在Executor接口中:public interface Executor { void execute(Runnable command); }这个方法是没有返回值的,而且只接受Runnable。那

喵了个呜的博客 4万+

submit写C语言怎么运行,submit提交方法(一)

除了execute方法之外,ThreadPoolExecutor 还有其他三个单提交的方法,它们的内部都是调用的execute方法。1. Future submit(Runnable)public Future< ? > submit(Runnable task)task要求一个 Runnable 实现类,返回一个 Future 对象。这个 Future 对象可以用来检查 Runnab...

weixin_29363919的博客 1311
上一篇: java程序员必会-远程debug
下一篇: 字节首席架构师整合面试痛点,成就399页Java框架核心宝典
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值