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

这篇具有很好参考价值的文章主要介绍了多线程环境下Java怎么从线程返回信息?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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哈希值。你可以使用该哈希值进行进一步的验证、比对或存储,以确保文件的完整性或进行其他安全相关的操作。最后程序也确实获取了线程的操作结果:多线程环境下Java怎么从线程返回信息?
但上面程序存在一个很大的问题,由于调用了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();
        }
    }
}

上面使用静态方法完成了回调文章来源地址https://www.toymoban.com/news/detail-456805.html

到了这里,关于多线程环境下Java怎么从线程返回信息?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 线程方法接收参数和返回参数,Java的两种线程实现方式对比

    总所周知,Java实现多线程有两种方式,分别是继承Thread类和实现Runable接口,那么它们的区别是什么? 继承 Thread 类: 通过继承 Thread 类,你可以创建一个直接表示线程的类。你可以覆盖 Thread 类中的 run 方法来定义线程的逻辑。当调用 start 方法启动线程时,会执行该类中的

    2024年02月11日
    浏览(42)
  • java多线程带返回值的方式方法

    使用线程池 方法一得到的结果如下,使用线程池我这里是核数乘以2是核心线程16,最大17,所以这里最多是16个线程,而且他是无序的随机分配的 重点不用线程池使用@Async注解,但是策略得有所调整,大体逻辑比如你待处理的数据有100条,你可以将这个List按10条为一个新的

    2024年01月22日
    浏览(43)
  • GPT升级信息:能记住用户的喜好和习惯!

    OpenAI刚刚宣布了ChatGPT的一项激动人心的更新! OpenAI在ChatGPT中新加了记忆功能和用户控制选项,这意味着GPT能够在与用户的互动中记住之前的对话内容,并利用这些信息在后续的交谈中提供更加相关和定制化的回答。 这一功能目前正处于测试阶段,OpenAI计划在本周向部分Ch

    2024年02月19日
    浏览(22)
  • java多线程异步处理并获取处理后的返回值

    示例部分代码:

    2024年02月06日
    浏览(43)
  • 协众信息改正使用PS的4个坏习惯

      PS用途广泛,方法多样。可以用不同的方法来实现同一种效果,有时,大家会被思维局限住,采用”最笨”的办法完成工作。   ​     本文,便是面对这一问题,罗列出PS使用中的10条坏习惯,相信只要克服这10个坏习惯,你的工作会更有效率。     1.在单一图层内工

    2024年02月06日
    浏览(33)
  • java发送https请求以及解析调用接口返回来的数据信息

    一、返回的Json数据信息格式 二、解析 引用的是 判断如果code为200则证明数据返回成功,然后获取data中的value数据。 获取data数据 这样就可以获取data中的数据了。 如果想要将data中的数据变成集合 就可以啦 三、发送https请求

    2024年02月19日
    浏览(39)
  • java调用接口返回乱码问题

    调用第三方接口。 当调用第三方接口时,存入数据库中的数据正常,打印的数据乱码,在header中加入charset=UTF-8即可。 此处用到了hutool的依赖: 示例代码: 第三方调用接口。 当第三方调用咱们的接口时,可能会出现返回信息中文乱码的情况,我们在自己的方法的注解上加

    2024年02月11日
    浏览(37)
  • 大数据扫黄是怎么抓到你的?看完你怕了吗?快点戒掉坏习惯

      大数据扫黄你们听过吗? 啥是大数据扫黄呢?互联网现在已经成为我们大家信息获取和通信交流的主要方式,黄色内容也是乘虚而入。 国家要打击这种涉黄行为,采取了很多的措施,主要是利用大数据技术进行监管。目前,大数据扫黄已成为打击网络涉黄、保护未成年人

    2024年03月26日
    浏览(35)
  • JVM学习(三)--生产环境的线程问题诊断

    使用top命令 使用ps H -eo pid,tid,%cpu | grep 进程id   (可以具体定位到某个进程的某个线程的cpu占用情况) 使用jstack 进程id |grep 32e4 -A20 (这里32e4就是线程的tid的16进制,A20表示显示前20行)可以找到当前进程的所有线程的具体信息,进而具体的代码行数,但是注意这里显示出来的

    2024年02月09日
    浏览(50)
  • 数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。

    最短路径的算法有两个, Dijkstra算法 和 Floyd算法 。 Dijkstra算法 解决的是 单源 最短路径问题 。 Floyd算法解决的是 多源 最短路径问题,并且可以处理负权图 。 今天要讲的就是Dijkstra算法。 加: feng--Insist (大写的i),进java交流群讨论互联网+技术。可索要PPT等资料。 其他资料

    2024年02月11日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包