在线程异步的场合下,如何将线程信息传递到调用处(1)

简介: 在线程异步的场合下,如何将线程信息传递到调用处

本篇我们来学习一下Java是如何获取线程的信息然后返回到调用线程处(学习书籍(Java网络编程)):

1.首先,我们来学习一个简单的线程,继承Thread类,然后输出文件的摘要信息

public class DigestThread extends Thread {
  private File input;
// 通过构造方法,我们将file对象传递到run方法
  public DigestThread(File input) {
    this.input = input;
  }
  public void run() {
    try {
      FileInputStream in = new FileInputStream(this.input);
      // 消息摘要
      MessageDigest sha = MessageDigest.getInstance("SHA");
      DigestInputStream din = new DigestInputStream(in, sha);
      // 要完成消息摘要计算,先要调用此摘要输入流的一个 read 方法,之后在关联的消息摘要上调用一个 digest 方法。
      while ((din.read()) != -1);
      din.close();
      byte [] digest = sha.digest();
      StringBuffer result = new StringBuffer(input.toString());
      result.append(": ");
      for (int i = 0; i < digest.length; i++) {
        result.append(digest[i] + " ");
      }
      // 输出
      System.out.println(result.toString());
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  public static void main(String[] args) {
    Thread thread = new DigestThread(new File("D:\\test\\demo01.html"));
    thread.start();
  }
}


3.单线程和多线程让程序员棘手的问题就是如何将线程的信息传递回线程的调用处,在以上实例中,我们只是把线程中获取的消息摘要输出,假如说我们要把摘要返回到主线程调用处,我们该怎么做呢。多数情况下,我们可以进行了一下操作,使用变量存储

3.1.线程类

  private File input;
  public ReturnDigestThread(File input) {
    this.input = input;
  }
  // 将摘要存储到该变量中,使用get set方法进行获取
  private byte [] digest;
  public void run() {
    try {
      FileInputStream in = new FileInputStream(this.input);
      // 消息摘要
      MessageDigest sha = MessageDigest.getInstance("SHA");
      DigestInputStream din = new DigestInputStream(in, sha);
      // 要完成消息摘要计算,先要调用此摘要输入流的一个 read 方法,之后在关联的消息摘要上调用一个 digest 方法。
      while ((din.read()) != -1);
      din.close();
      // 设置到results变量中
      setDigest(sha.digest());
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  public byte[] getDigest() {
    return digest;
  }
  public void setDigest(byte[] digest) {
    this.digest = digest;
  }


3.2.主线程类

public static void main(String[] args) {
    File input = new File("D:\\test\\demo01.html");
    ReturnDigestThread thread = new ReturnDigestThread(input);
    thread.start();
    // 输出
    StringBuffer result = new StringBuffer(input.toString());
    result.append(": ");
    // 通过对象的变量获取线程的执行结果
    for (int i = 0; i < thread.getDigest().length; i++) {
      result.append(thread.getDigest()[i] + " ");
    }
    System.out.println(result.toString());
  }


错误 写道

Exception in thread "main" java.lang.NullPointerException

at network.ReturnDigestUserInterface.main(ReturnDigestUserInterface.java:18)

修改主线程 写道

public static void main(String[] args) throws InterruptedException {


File input = new File("D:\\test\\demo01.html");

ReturnDigestThread thread = new ReturnDigestThread(input);

thread.start();


// 这样做只是可能会得到了我们想要的结果,但是,依然是错误的做法

Thread.sleep(100);


// 输出

StringBuffer result = new StringBuffer(input.toString());

result.append(": ");


// 通过对象的变量获取线程的执行结果

for (int i = 0; i < thread.getDigest().length; i++) {

result.append(thread.getDigest()[i] + " ");

}

System.out.println(result.toString());

}

相关文章
|
4月前
|
编解码 数据安全/隐私保护 计算机视觉
Opencv学习笔记(十):同步和异步(多线程)操作打开海康摄像头
如何使用OpenCV进行同步和异步操作来打开海康摄像头,并提供了相关的代码示例。
180 1
Opencv学习笔记(十):同步和异步(多线程)操作打开海康摄像头
|
9天前
|
缓存 安全 Java
面试中的难题:线程异步执行后如何共享数据?
本文通过一个面试故事,详细讲解了Java中线程内部开启异步操作后如何安全地共享数据。介绍了异步操作的基本概念及常见实现方式(如CompletableFuture、ExecutorService),并重点探讨了volatile关键字、CountDownLatch和CompletableFuture等工具在线程间数据共享中的应用,帮助读者理解线程安全和内存可见性问题。通过这些方法,可以有效解决多线程环境下的数据共享挑战,提升编程效率和代码健壮性。
37 6
|
1月前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
109 17
|
4月前
|
安全 调度 C#
STA模型、同步上下文和多线程、异步调度
【10月更文挑战第19天】本文介绍了 STA 模型、同步上下文和多线程、异步调度的概念及其优缺点。STA 模型适用于单线程环境,确保资源访问的顺序性;同步上下文和多线程提高了程序的并发性和响应性,但增加了复杂性;异步调度提升了程序的响应性和资源利用率,但也带来了编程复杂性和错误处理的挑战。选择合适的模型需根据具体应用场景和需求进行权衡。
|
4月前
|
网络协议 安全 Java
难懂,误点!将多线程技术应用于Python的异步事件循环
难懂,误点!将多线程技术应用于Python的异步事件循环
124 0
|
6月前
|
缓存 Java
异步&线程池 线程池的七大参数 初始化线程的4种方式 【上篇】
这篇文章详细介绍了Java中线程的四种初始化方式,包括继承Thread类、实现Runnable接口、实现Callable接口与FutureTask结合使用,以及使用线程池。同时,还深入探讨了线程池的七大参数及其作用,解释了线程池的运行流程,并列举了四种常见的线程池类型。最后,阐述了在开发中使用线程池的原因,如降低资源消耗、提高响应速度和增强线程的可管理性。
异步&线程池 线程池的七大参数 初始化线程的4种方式 【上篇】
|
6月前
|
Java 数据库
异步&线程池 CompletableFuture 异步编排 实战应用 【终结篇】
这篇文章通过一个电商商品详情页的实战案例,展示了如何使用`CompletableFuture`进行异步编排,以解决在不同数据库表中查询商品信息的问题,并提供了详细的代码实现和遇到问题(如图片未显示)的解决方案。
异步&线程池 CompletableFuture 异步编排 实战应用 【终结篇】
|
5月前
|
设计模式 缓存 Java
谷粒商城笔记+踩坑(14)——异步和线程池
初始化线程的4种方式、线程池详解、异步编排 CompletableFuture
|
6月前
|
Java Windows
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
|
6月前
|
Java
异步&线程池 CompletableFuture 异步编排 【下篇】
这篇文章深入探讨了Java中的`CompletableFuture`类,解释了如何创建异步操作、使用计算完成时的回调方法、异常处理、串行化方法、任务组合以及多任务组合的使用方式,并通过代码示例展示了各种场景下的应用。
异步&线程池 CompletableFuture 异步编排 【下篇】

相关实验场景

更多