在线程异步的场合下,如何将线程信息传递到调用处(2)-阿里云开发者社区

开发者社区> 沉默王二> 正文

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

简介: 在线程异步的场合下,如何将线程信息传递到调用处
+关注继续查看

修改主线程 写道

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


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

ReturnDigestThread thread = new ReturnDigestThread(input); 

thread.start(); 


// 输出 

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

result.append(": "); 


// 进行轮询 

int count = 0; 

while (true) {

System.out.println(count++);

// 如果摘要为空,则进行获取

byte[] digest = thread.getDigest();

if (digest != null) {

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

result.append(digest[i] + " "); 

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

// 然后退出循环 

break; 

}

结果 写道

... 

659 

660 

661 

662 

663 

664 

665 

666 

667 

D:\test\demo01.html: 84 56 116 -95 -96 -119 -123 -19 117 -125 22 48 53 13 -111 125 106 -66 44 69

子线程 写道

package network; 


import java.io.File; 

import java.io.FileInputStream; 

import java.io.FileNotFoundException; 

import java.io.IOException; 

import java.security.DigestInputStream; 

import java.security.MessageDigest; 

import java.security.NoSuchAlgorithmException; 


public class CallbackDigestThread extends Thread { 

private File input; 

public CallbackDigestThread(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(); 


// 回调主线程方法进行输出结果 

CallbackDigestUserInterface.reciveDigest(sha.digest(), this.input.toString()); 

} catch (FileNotFoundException e) { 

e.printStackTrace(); 

} catch (NoSuchAlgorithmException e) { 

e.printStackTrace(); 

} catch (IOException e) { 

e.printStackTrace(); 

}

主线程 写道

package network; 


import java.io.File; 


public class CallbackDigestUserInterface { 


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

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

Thread thread = new CallbackDigestThread(input); 

thread.start(); 


/** 

* 通过提供该方法到子线程,子线程在得到digest后,回调该方法输出. 

* @param digest 

* @param name 

*/ 

public static void reciveDigest(byte[] digest, String name) { 

// 输出 

StringBuffer result = new StringBuffer(name); 

result.append(": "); 


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

result.append(digest[i] + " "); 

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


}

子线程 写道

package network; 


import java.io.File; 

import java.io.FileInputStream; 

import java.io.FileNotFoundException; 

import java.io.IOException; 

import java.security.DigestInputStream; 

import java.security.MessageDigest; 

import java.security.NoSuchAlgorithmException; 


public class InstanceCallbackDigestThread extends Thread { 

private File input; 

private InstanceCallbackDigestUserInterface callback; 


// 通过构造方法,我们将实例对象传递过来 

public InstanceCallbackDigestThread(File input, InstanceCallbackDigestUserInterface callback) {

this.input = input;

this.callback = callback;

}


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(); 


// 回调主线程方法进行输出结果 

主类 写道

package network; 


import java.io.File; 


public class InstanceCallbackDigestUserInterface { 


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

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

InstanceCallbackDigestUserInterface callback = new InstanceCallbackDigestUserInterface();


// 将实例对象传递到子线程中

Thread thread = new InstanceCallbackDigestThread(input, callback);

thread.start(); 


/** 

* 通过提供该方法到子线程,子线程在得到digest后,回调该方法输出. 

* @param digest 

* @param name 

*/ 

public void reciveDigest(byte[] digest, String name) { 

// 输出 

StringBuffer result = new StringBuffer(name); 

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(); 

}

listener 写道

package network; 


import java.io.File; 

import java.io.FileInputStream; 

import java.io.FileNotFoundException; 

import java.io.IOException; 

import java.security.DigestInputStream; 

import java.security.MessageDigest; 

import java.security.NoSuchAlgorithmException; 


public class ListCallbackDigestRunnable implements Runnable { 

private File input; 

private DigestListener listener; 


public ListCallbackDigestRunnable(File input) { 

this.input = input; 


private void sendDigest(byte[] digest) { 

listener.digestCalculdated(digest); 


public void run() { 

try { 

FileInputStream in = new FileInputStream(this.input); 

// 消息摘要 

MessageDigest sha = MessageDigest.getInstance("SHA"); 

DigestInputStream din = new DigestInputStream(in, sha); 


// 要完成消息摘要计算,先要调用此摘要输入流的一个 read 方法,之后在关联的消息摘要上调用一个 digest 方法。 

// read方法会因为文件的大小而阻塞 

while ((din.read()) != -1) 

din.close(); 


byte[] digest = sha.digest(); 


// 当前线程获取到当前文件的digest后,会通过listener将摘要信息通过主线程的接口方法进行输出. 

this.sendDigest(digest); 


} catch (FileNotFoundException e) { 

e.printStackTrace(); 

} catch (NoSuchAlgorithmException e) { 

e.printStackTrace(); 

} catch (IOException e) { 

e.printStackTrace(); 


public DigestListener getListener() { 

return listener; 


public void setListener(DigestListener listener) { 

this.listener = listener; 

}

主程序 写道

package network; 


import java.io.File; 


public class ListCallbackDigestUserInterface implements DigestListener { 


private File input; 


public ListCallbackDigestUserInterface(File input) { 

this.input = input; 


/** 

* 启动不同的线程,对消息摘要进行处理 

*/ 

private void digestCalculated() { 

ListCallbackDigestRunnable cb = new ListCallbackDigestRunnable(input); 

// 为当前线程设置自己的listener 

cb.setListener(this); 


Thread t = new Thread(cb); 

t.start(); 


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

// 进行三个文件的摘要信息输出 

String[] filenames = { "D:\\test\\demo01 - 副本.html", "D:\\test\\demo01 - 副本 (2).html", 

"D:\\test\\demo01.html" }; 

for (String filename : filenames) { 

File input = new File(filename); 

// 创建当前对象实例 

ListCallbackDigestUserInterface d = new ListCallbackDigestUserInterface(input); 

d.digestCalculated(); 


@Override 

public void digestCalculdated(byte[] 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()); 


}

接口 写道

package network; 


public interface DigestListener { 


/** 

* 对摘要进行处理. 

* @param digest 

*/ 

public void digestCalculdated(byte [] digest); 

}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10073 0
在线程异步的场合下,如何将线程信息传递到调用处(2)
在线程异步的场合下,如何将线程信息传递到调用处
14 0
使用管道流构建线程信息通道 | 带你学《Java语言高级特性》之六十二
在之前学习的几种IO流中不难发现,它们在面对线程间通信问题的时候显然无法实现IO操作,这时需要用到本节介绍的管道流来进行处理。
740 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13882 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
11888 0
解析如何在C语言中调用shell命令的实现方法【转】
本文转自:http://www.jb51.net/article/37404.htm 1、system(执行shell 命令)相关函数 fork,execve,waitpid,popen表头文件 #include定义函数 int system(const char * string);函数说明 system()会调用fork()产生子进程,由子进程来调用/bin/sh-cstring来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。
807 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
7365 0
+关注
沉默王二
微信搜索「沉默王二」,回复关键字「00」获取硬核计算机基础资料。
1084
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载