多线程环境下Java怎么从线程返回信息?

news2025/1/11 9:49:19

1. 问题描述

习惯了传统单线程过程式模型的程序员在转向多线程环境时,最难掌握的一点就是如何从线程返回信息。从结束的线程获得信息,这是多线程编程中最常被误解的方面之一。run()方法和start()方法不返回任何值。

2. 使用存储方法返回结果

如下面程序

public class QuizCardBuilder {
    public static void main(String[] args) throws InterruptedException {
        ReturnDigest dr=new ReturnDigest("foo.ser");
        dr.start();
        dr.join();
        StringBuilder re=new StringBuilder("foo.ser");
        re.append(": ");
        byte[] digest=dr.getDigest();
        re.append(DatatypeConverter.printHexBinary(digest));
        System.out.println(re);
    }
}
class ReturnDigest extends Thread{
    private String filename;
    private byte[] digest;

    public ReturnDigest(String filename){
        this.filename=filename;
    }

    public byte[] getDigest() {
        return digest;
    }

    @Override
    public void run(){
        try{
            FileInputStream in=new FileInputStream(filename);
            MessageDigest sha=MessageDigest.getInstance("SHA-256");
            DigestInputStream din=new DigestInputStream(in ,sha);
            while(din.read()!=-1){//读取文件的信息
            }
            din.close();
            digest=sha.digest();
        }catch (IOException | NoSuchAlgorithmException e){
            e.printStackTrace();
        }
    }

}

子线程的的作用是计算文件的SHA-256哈希值。解释如下:

  • 首先,使用FileInputStream类创建一个输入流in,用于读取指定文件filename的内容。
  • 接下来,通过MessageDigest.getInstance(“SHA-256”)获取一个SHA-256的MessageDigest对象sha,用于计算哈希值。
  • 然后,创建一个DigestInputStream对象din,将输入流in和sha对象传递给它。DigestInputStream是一个过滤流,它可以在数据流中进行数据处理,并计算哈希值。
  • 在一个循环中,通过din.read()不断读取文件的数据,直到文件的末尾(返回值为-1)。这个循环的目的是将文件的内容传递给DigestInputStream,使其能够计算哈希值。
  • 读取完成后,关闭DigestInputStream,调用din.close()。
  • 最后,通过sha.digest()获取计算得到的SHA-256哈希值的字节数组,并将其赋值给变量digest。

通过上述代码,文件的内容会被逐个字节地读取并传递给DigestInputStream,而DigestInputStream会将这些数据输入到MessageDigest对象sha中进行处理。在循环结束后,通过调用sha.digest()获取最终的SHA-256哈希值。你可以使用该哈希值进行进一步的验证、比对或存储,以确保文件的完整性或进行其他安全相关的操作。最后程序也确实获取了线程的操作结果:
但上面程序存在一个很大的问题,由于调用了join主线程一直阻塞在这里,这样程序的效率是很不高的,所以我们介绍一种更好的方法,即回调机制

3. 回调机制

该机制是通过调用主类(即启动子线程的类)中的一个方法来做到的。这种被称为回调(CallBack),因为线程在完成时反过来调用其创建者。这样依赖,主程序就可以在等待线程结束期间休息,而不会占用运行线程的时间。

public class QuizCardBuilder {
    public static void receiveDigest(byte[] digest,String name){
        StringBuilder re=new StringBuilder(name);
        re.append(": ");
        re.append(DatatypeConverter.printHexBinary(digest));
        System.out.println(re);
    }
    public static void main(String[] args) throws InterruptedException {
        ReturnDigest re=new ReturnDigest("foo.ser");
        Thread t=new Thread(re);
        t.start();
    }
}
class ReturnDigest extends Thread{
    private String filename;
    private byte[] digest;

    public ReturnDigest(String filename){
        this.filename=filename;
    }

    public byte[] getDigest() {
        return digest;
    }

    @Override
    public void run(){
        try{
            FileInputStream in=new FileInputStream(filename);
            MessageDigest sha=MessageDigest.getInstance("SHA-256");
            DigestInputStream din=new DigestInputStream(in ,sha);
            while(din.read()!=-1){//读取文件的信息
            }
            din.close();
            digest=sha.digest();
            QuizCardBuilder.receiveDigest(digest,filename);
        }catch (IOException | NoSuchAlgorithmException e){
            e.printStackTrace();
        }
    }
}

上面使用静态方法完成了回调

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

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

相关文章

自动化档案档案库房库房温湿度调节的好处

档案库房环境温湿度不合适,那么会造成供配电系统、网络设备不稳定,机房无法正常运行、资料老化。仓库温湿度不合适,储藏货物就会霉变、腐烂,给企业带来经济损失。所以环境温湿度必须实时处于可视、可控的范围,因此要安…

从零开始 Spring Boot 34:日志 II

从零开始 Spring Boot 34:日志 II 图源:简书 (jianshu.com) 在从零开始 Spring Boot 10:日志 - 红茶的个人站点 (icexmoon.cn)中,我简单介绍过如何在Spring Boot中整合SLF4J日志。实际上,如果没有特殊需求&#xff0c…

开发一套pacs系统主要解决的问题有哪些?

PACS的定义 PACS(picture archiving and communication system)意为影像归档和通信系统。它是应用在医院影像科室的系统,主要的任务就是把日常产生的各种医学影像(包括核磁,CT,超声,各种X光机&…

MySQL---锁机制

1. 锁的分类 从对数据操作的粒度分 : 表锁:操作时,会锁定整个表。 行锁:操作时,会锁定当前操作行。 从对数据操作的类型分: 读锁(共享锁):针对同一份数据&#xff…

ChatGPT与低代码开发:危机四伏、技术暴走!

随着人工智能技术和低代码开发平台的不断发展,越来越多的企业开始采用AI技术来提高业务效率和创造更好的用户体验。AI技术与低代码开发的结合,为企业节省了大量时间和成本,同时也提高了业务创新和竞争力。然而,一些潜在的问题也开…

关于怎么用好API接口获取更多信息节约时间成本

API接口是现代互联网应用开发的重要工具,它允许开发者使用标准化的方式获取数据和服务,在搭建应用中扮演了重要的角色。因此,如何利用API接口获取更多信息已经成为了每个开发者需要掌握的技能之一。 第一步:寻找 API接口 在开始…

2023Revit精装模块,一键搞定便捷精装!

大家好,这里是BIM建模助手。 今天有个重磅消息要告诉大家,那就是BIM建模助手的【精装模块】上线啦! 为了辅助BIMer快速设计出精装修的房屋效果,我们开发了【精装模块】,无论是装饰面层、铺排瓷砖、布置吊顶、统计出量…

​​​​​​​博物馆文物馆藏环境空气质量无线监控系统方案

博物馆文物馆藏环境空气质量无线监控系统方案 博物馆无线环境测控系统 博物馆恒温恒湿消毒净化系统 现代化博物馆空气质量一体化3D可视化管控平台 博物馆温湿度在线监控系统 博物馆光照在线监控系统 博物馆二氧化碳在线监控系统 博物馆在线监控系统 博物馆紫外线在线监控…

【TikZ 简单学习(下):基础绘制】Latex下的绘图宏包

【TikZ 简单学习[下]:基础绘制】Latex下的绘图宏包 上文绘制多个节点给节点添加统一样式给节点命名使用相对位置绘制给节点标签链接边的绘制在线边上添加标签绘制蛇形线和多行文本层图绘制一个简单的树 上文 【TikZ 简单学习(上):基础绘制】Latex下的绘…

【笔试强训选择题】Day19.习题(错题)解析

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!&#xff…

深度学习神经网络学习笔记-多模态方向-11-Deep Voice: Real-time Neural Text-to-Speech

摘要 本文提出Deep Voice,一种完全由深度神经网络构建的生产质量文本到语音系统。Deep Voice为真正的端到端神经语音合成奠定了基础。该系统由五个主要的构建模块组成:用于定位音素边界的分割模型、字素到音素的转换模型、音素时长预测模型、基频预测模型和音频合成…

那年我手执『wait』桃木剑,轻松解决僵尸进程~

文章目录 💐专栏导读💐文章导读🐧进程退出🐦进程常见的退出方法🐔正常终止🔔return 退出🔔exit 退出🔔_exit 退出 🐔异常终止 🐧进程等待🐦必要性…

00后实在太卷了,跳槽到我们公司起薪20k,都快超过我了....

都说00后已经躺平了,但是有一说一,该卷的还是卷。 前段时间我们部门就来了个00后,工作都还没两年,跳到我们公司起薪20K,都快接近我了。 后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。最近和…

美股股指期货是什么?有哪些美股股指期货交易门槛?

美股期指就是美股期货指数,并不是单独的指道琼斯还是纳斯达克,就好像中国的股指期货一样道理,是以沪深300为标的的,美股期指也是期货,不是单纯的指数。交易美股产品需要先完成开户,要想一次性开户成功就要满…

2023.4月及5月最新HCIP 考试战报来袭

2023年HCIP/CCNP考试战报_微思xmws的博客-CSDN博客国内企业或国企、事业单位,华为设备普及,国内未来发展趋势,考华为认证更被认可。如果你在外企上班或有出国打算,推荐考思科。https://blog.csdn.net/XMWS_IT/article/details/129…

【隔空投送】2023新品,加速科技ST2500E重磅来袭

随着5G通信、人工智能、虚拟现实、新能源以及先进封装技术的飞速发展,芯片线宽尺寸不断减小,芯片复杂度不断跃升,对测试机的要求愈加提高。提供多种测试程序并可进行大量的并行测试,有效减少测试成本,缩短产品上市时间…

Paddle 模型转 TensorRT加速模型

Paddle 模型转 TensorRT加速模型 概述 NVIDIA TensorRT 是一个高性能的深度学习预测库,可为深度学习推理应用程序提供低延迟和高吞吐量。PaddlePaddle 采用子图的形式对TensorRT进行了集成,即我们可以使用该模块来提升Paddle模型的预测性能。在这篇文章…

Ubuntu显示时间不正确的问题解决

安装完ubuntu后,发现我的ubuntu显示的时间不对,和网络的时间根本对不上。网上查找了相关设置方法,这里总结一下。 一般来说,显示时间不正确的情况就两种情况,第一:是你系统设置的时区不对;第二…

多层感知机学习XOR实例

多层感知机学习XOR实例 多层感知机介绍使用多层感知机学习XOR实例传统统计数学方法(传统机器学习)使用多层感知机学习XOR 总结 多层感知机介绍 多层感知机(Multilayer Perceptron,MLP),又称为深度前馈网络…

Compose 二三事:绘制原理

setContent做了什么 我们基于一个最简单的例子进行分析 class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {Text(text "Hello World!")}} }这里setContent做了什么…