Future/callable的作用,如何判断一个主线程的所有子线程全部执行结束

05. 异步线程创建-Callable 方式 1. Callable 方式 Callable 方式最主要的特点就是可以阻塞式获取子线程执行结果, 也就是说对于长耗时的任务,可以放到子线程中执行, 而主线程去执行其它任务. 当主线程执行完其它任务之后, 需要获取子线程任务返回结果时, 如果子线程没有执行完, 主线程会阻塞, 等子线程执行完之后, 再继续执行. 1.1 Callable 特点 面向接口编程, 松耦合设计 在多线程模式下,可实现对... 阅读详情

 future:一般用于一个主业务中需要调用多个子业务,而且多个子业务之间相互不受影响,所有子业务都完成后统一返回的场景,可大大提高运行速度!

比如:做一份西红柿炒鸡蛋,炒西红柿和炒鸡蛋完全可以同时运行,那么就可以创建两个callable线程,同时去做,当两个都做好之后,混合起来再炒一下就行了。

如果炒西红柿5秒,炒鸡蛋5秒,混合炒5秒,正常流程的话需要15秒,但是用callable线程的话就只需要10秒(西红柿和炒鸡蛋并行处理)省去了5秒的时间!


开火

        炒西红柿

        炒鸡蛋

        混合炒

关火


开火

       future1 = callable(炒西红柿)

       future2 = callable(炒鸡蛋)

       future1.get();

       future2.get();

​       混合炒

关火

package com.ws;

import java.util.concurrent.*;

public class FutureTest {

    public static void main(String[] args) {
        /*
           如果想要获取返回值,我们需要new Callable接口,而且我们要用Executors 线程工具类
         */
        long s = System.currentTimeMillis();

        ExecutorService executor = Executors.newFixedThreadPool(2);

        Future<String> xihongshi = executor.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                Thread.sleep(5000);
                return "西红柿已经处理完成!";
            }
        });
        Future<String> jidan = executor.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                Thread.sleep(5000);
                return "鸡蛋已经处理完成!";
            }
        });
        /*
            如何拿到future的结果呢?
            future.get();
            这个get方法是一个阻塞方法,当callable子线程结束之后就能拿到结果
            get(times,type) 可以设置最大等待时长,超时则报错
         */
        try {
            // 同时get() 只有全部执行完才会往下走
            String r1 = xihongshi.get();
            System.out.println(r1);
            String r2 = jidan.get();
            System.out.println(r2);
            // DO SOME THING
            System.out.println("开始混合炒!");
            Thread.sleep(5000);
            System.out.println("炒完了,累计用时"+(System.currentTimeMillis()-s)/1000+"秒!");
            executor.shutdown();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}



--------------------------------------------------------
西红柿已经处理完成!
鸡蛋已经处理完成!
开始混合炒!
炒完了,累计用时10秒!

Java 通过主线程实现子线程的超时控制 package com.bill99.seashell.fsp.quartz.test; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.con 阅读详情

相关推荐

ubuntu20.04下dsp-slam的运行配置

DSP-SLAM:具有深度形状先验的面向对象的 SLAM

baidu_38431960的博客 3159

使用 CompletableFuture 实现所有任务都执行完之后在执行下一步操作

方法接收一个 CompletableFuture 数组,当所有 CompletableFuture 都完成时,它将返回一个新的 CompletableFuture,该 CompletableFuture 不包含任何结果,但表示所有任务都已完成。在 CompletableFuture 中实现所有任务都执行完之后再执行下一步操作,我们可以使用。方法在其上执行下一步操作。如果我们需要使用上一步的计算结果来执行下一步操作,我们应该使用。方法在所有任务完成后执行下一步操作。方法创建了三个异步任务,并使用。

weixin_43440709的博客 8980

【codex教程】Codex 注册和使用教程(2026最新版)

Codex 是 OpenAI 推出的 AI 编程助手,可以帮助开发者阅读代码、修改代码、运行命令、生成测试、排查 bug、做代码审查,也可以在终端、IDE、Codex App 或网页端使用。根据 OpenAI 帮助中心,截至 2026 年 6 月,Codex 已包含在 Free、Go、Plus、Pro、Business、Edu 和 Enterprise 等 ChatGPT 方案中,但不同套餐的使用额度会有所不同。适合开发者在终端中使用。如果你想在命令行里使用 Codex,可以安装 Codex CLI。

与时俱进,开放共享 2万+

多线程并发 之 判断线程任务是否全部结束

文章目录1、前言 1、前言

WU4566285的博客 4189

ARM64麒麟V10系统下PyTorch离线安装全攻略(附资源下载)

本文详细介绍了在ARM64架构的银河麒麟V10操作系统上,如何通过离线方式成功安装PyTorch深度学习框架。文章提供了从系统环境准备、依赖梳理、离线资源获取与验证,到分步安装、避坑指南及安装后验证的完整流程,并附有资源下载建议,旨在帮助开发者在国产化环境中高效部署AI开发平台。

metal的博客 747

YOLOv11 + TensorRT 在 Jetson 设备上的实时部署

YOLOv11 + TensorRT 在 Jetson 设备上的实时部署

p6666666668的博客 1588

判断线程是否全部结束

@Autowired ThreadPoolTaskExecutor threadPoolTaskExecutor; //判断线程是否全部执行结束 while (threadPoolTaskExecutor.getActiveCount() > 0){ try { Thread.sleep(100...

weixin_43850799的博客 1113

【SimPy系列博客之官方example学习与解读】—— Example 1: Bank Renege

Hello,优快云的各位小伙伴们,拖更了几年后,又重新开始记录这段时间准备学习的东西啦!最近博主在学习 SimPy 的相关知识,发现国内关于 SimPy 的介绍还是相对较少,且缺乏系统性,因此博主打算用1~2周的时间,边学边记,打算从 SimPy 官方给出的几个例子出发分析 SimPy 的使用场景和用法,希望能和大家互勉!那废话不多说,我们直接开始吧!今天要学习的例程是 Bank Renege。

凝望,划过星空的博客 2009

多线程异步执行,等待执行全部执行完成后,返回全部结果 CompletableFuture和Future以及CountDownLatch 使用

【代码】多线程异步执行,等待执行全部执行完成后,返回全部结果 CompletableFuture和Future以及CountDownLatch 使用。

weixin_43051544的博客 5182

深入解析Transformer三大注意力机制:自注意力、交叉注意力与因果自注意力

注意力机制是深度学习中的核心概念,它模拟了人类在处理信息时选择性聚焦的能力。其基本原理是通过计算查询与键的相似度,动态地为值分配权重,从而提取关键信息。这一机制解决了传统序列模型(如RNN)难以并行化和捕获长距离依赖的痛点,技术价值在于显著提升了模型的计算效率和表征能力。在自然语言处理、计算机视觉等应用场景中,注意力机制已成为构建强大模型的基石。本文聚焦于Transformer架构中的三种核心注意力变体:自注意力用于建立序列内部的全局关联,交叉注意力连接编码器与解码器的信息,而因果自注意力则确保自回归生成的

weixin_29094775的博客 414

SAP HANA 中的 Union Node Pruning:让 Calculation View 少走弯路的关键优化

摘要:SAP HANA的Union Node Pruning技术通过在执行前排除无关数据源来优化查询性能。该技术主要采用三种方式:Constant Mapping(适用于规则稳定的场景)、Pruning Configuration Table(灵活性高)和Column-Based Pruning(基于列可用性)。典型应用场景包括分层存储的数据查询,如区分当前和历史销售数据。需要注意的是,当查询发生Unfolding且不含聚合时,Pruning可能失效,此时可通过NO_CALC_VIEW_UNFOLDING提

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 875

java 多线程 submit future.get方法阻塞问题的解决,实现按照任务完成的先后顺序获取任务的结果

1、Future Future模式是多线程设计常用的一种设计模式。Future模式可以理解成:我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时间之后,我就便可以从Future那儿取出结果。 Future提供了三种功能: 判断任务是否完成 能够中断任务 能够获取任务执行的结果 向线程池中提交任务的submit方法不是阻塞方法,而Future.get方法是一个阻塞方法,当submit提交多个任务时,只有所有任务都完成后,才能使用get按照任务的提交顺序

You can walk as far as you want. 5515

微信小程序 - 最新图片组拖拽排序更换位置功能,类似微信朋友圈九宫格图片的拖动排序效果,微信小程序实现九宫格图片拖拽调换位置,小程序详细实现图像拖曳拖动切换位置排序功能(详细示例代码,一键复制开箱即用

微信小程序,wechat,小程序,图片排序,图像排序,九宫格拖拽排序,拖曳,拖动,拖拽,仿微信朋友圈,朋友圈宫格图片排序,微信朋友圈图片拖动排序效果,实现九宫格图片拖拽,图像拖拽排序组件插件,小程序实现拖拽图片切换图片位置,图片拖动互换位置,图像拖拽切换位置,九宫格图片组合拖动排序,交换九宫格图片的位置,小程序上传图片后,如何实现拖拽排序功能,小程序怎么实现图片拖拽排序,微信小程序图片上传,九宫格拖拽组件,选择图片并拖动_微信小程序图片拖拽,微信小程序长按拖拽排序,图像的拖拽移动,多图拖拽排序功能,实现九宫

✅ 精选推荐文章 4455

Java面试必备:Java中主线程如何知晓子线程执行状态的方法

在多线程编程中,主线程创建并启动子线程后,经常需要了解子线程的执行状态和结果。Java提供了多种机制来实现主线程与子线程之间的通信和状态监控。本文将详细介绍这些方法,并通过流程图帮助理解。

qq_58299462的博客 741

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

子线程向主线程传值,主线程向子线程传值

主线程在创建子线程的时候通过构造函数向子线程传值。 子线程向主线程传值我会的有两种方式: 第一种是在主线程创建好并start()方法后,让主线程陷入阻塞状态,等待子线程结束,然后主线程继续运行 第二种是继承Callable接口     //实现Callable接口 import java.util.concurrent.Callable; public class Ride imp

幸福小猪的专栏 7774

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【Thread】JAVA 实现主线程等待子线程执行完毕后再执行

工作总往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完后再把那段逻辑的处理结果进行汇总的场景, 这时候就需要使用线程了. 一个线程启动之后, 是异步的去执行需要执行的内容的, 不会影响主线程的流程, 往往需要让主线程指定后, 等待子线程的完成。并且,主线程是要利用到子线程的返回数据进行处理。这里有2种方式:实现 Callable 接口、join() 方法 1、实现 Callable 接口 class SubThread implements Callable<Integer> {

sco5282的博客 2253

java主线程结束和子线程结束之间的关系

java主线程结束和子线程结束之间的关系 你应该换成main函数运行,abcd就一定会打印出来了问题并不是出在主线程和子线程身上,事实上Java似乎也没有严格主线程和子线程的概念,取而代之的是普通线程和后台线程但是这里你采用@Test来运行代码,而@Test是JUnit测试框架使用的注解,JUnit在进行单元测试的时候,...

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 627

Future - 获取子线程执行结果

1. 为什么要Future机制 对比常见的两种创建线程的方式,一种是直接继承Thread,另外一种就是实现Runnable接口,他们在执行完任务之后无法获取执行结果,从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果 Future模式的核心思想是能够让主线程将原来需要同步等待的这段时间用来做其他的事情。(因为可以异步获得执行结果,所以不用...

Javaer`s blog 1578

主线程等待子线程执行完成的三种方法介绍

举个场景,用户表t_user根据userid做了分库分表,数据散列在了三个库表里t_user1、t_user2、t_user3,此时的count(t_user)需要count(t_user1) + count(t_user2) + count(t_user3)。我们为了提高性能,减少count(t_user)的响应时长,可以通过多线程并行执行各个子count,然后在主线程里将各个子任务的结果集进行

fanfan_v5的博客 3584

使用Callable和Future创建线程

一点睛 从Java 5开始,Java提供了Callable接口,该接口是Runnable接口的增强版,Callable接口提供了一个call()方法,可以看作是线程的执行体,但call()方法比run()方法更强大。 call()方法可以有返回值。 call()方法可以声明抛出异常。 创建并启动线程的步骤如下: 1创建Callable接口的实现类,并实现call()方法...

实践求真知 4514

java主线程等待所有子线程执行完毕在执行

        java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工...

学习达人的日记本 695

Java主线程能拿到子线程抛出的异常吗?

在Java中,主线程默认情况下不能直接拿到子线程抛出的异常。

岁月静好 537

Java主线程监控子线程执行状态的完全指南:5种方案精准捕获成功与异常

主线程通过Future模式、回调机制或同步屏障来判断子线程执行状态——Runnable不返回结果需配合Future,Callable直接返回结果,异常通过ExecutionException捕获。📌本质理解:判断子线程是否执行成功,核心是获取两个信息——①子线程是否正常结束(无异常)②子线程是否产生了预期的业务结果(如果有返回值)。主线程知晓子线程执行状态的核心手段是通过Future模式获取返回值和异常。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 292

Java并发-CountDownLatch、CyclicBarrier、Semaphore、Runnable、Callable、Future、FutureTask总结记录

1、CountDownLatch、CyclicBarrier、Semaphore,都位于java.util.concurrent包中,是并发控制的辅助类,可以控制线程的协同工作; 2、Runnable(java.lang.Runnable)、Callable(java.util.concurrent),作为线程创建相关类; 3、Future(java.util.concurrent),是对于具体...

Muscleape的博客 542

java 线程池 等待_Java线程池主线程等待子线程执行完成

publicclassThreads {staticExecutorServiceexecutorService=Executors.newFixedThreadPool(1);@SuppressWarnings(“rawtypes”)publicstaticvoidmain(String[]args)throwsInterru...

weixin_29945371的博客 2035
上一篇: kafka用法及名词解析
下一篇: kafka实现内部事务机制
JNWsong
博客等级 码龄9年 287粉丝 204原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值