标签:
//非多线程
package test;
import java.io.*;
import java.security.DigestInputStream;
import java.security.MessageDigest;
/*
* 利用DigestInputStream完成消息摘要计算,
* 先调用此摘要输入流的一个 read 方法,之后在关联的消息摘要上调用一个 digest方法。
* 本案例包含两个程序,其中一个采用多线程,相互比较.
*/
public class DigestThread2 {
private static File input;
private static long beginTime ;
public static void main(String[] args) {
beginTime = System.currentTimeMillis();
for (int i = 0; i < args.length; i++) {
input = new File(args[i]);
try {
FileInputStream in = new FileInputStream(input);
MessageDigest sha = MessageDigest.getInstance("SHA");
DigestInputStream din = new DigestInputStream(in, sha);
int b;
while ((b = din.read()) != -1);
din.close();
byte[] digest = sha.digest();
// 用一个字符缓冲器缓存
StringBuffer res = new StringBuffer(input.toString());
res.append(": ");
for (int j = 0; j < digest.length; j++) {
res.append(digest[j] + " ");
}
long endTime = System.currentTimeMillis();
System.out.println(Thread.currentThread().getName()+":"+res+"耗时 "+(endTime-beginTime)/1000+"秒");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
//多线程package test;
import java.io.*;
import java.security.DigestInputStream;
import java.security.MessageDigest;
/*
* 利用DigestInputStream完成消息摘要计算,
* 先调用此摘要输入流的一个 read 方法,之后在关联的消息摘要上调用一个 digest方法。
* 本案例包含两个程序,其中一个采用多线程,相互比较.
*/
public class DigestThread extends Thread{
private static long beginTime ;
private File input;
public DigestThread(File input){
this.input=input;
}
//----------覆盖run()方法----------
public void run(){
try {
FileInputStream in=new FileInputStream(input);
MessageDigest sha=MessageDigest.getInstance("SHA");
DigestInputStream din=new DigestInputStream(in, sha);
int b;
while((b=din.read())!=-1);//不断读取
din.close();
byte[] digest=sha.digest();
//用一个字符缓冲器缓存
StringBuffer res=new StringBuffer(input.toString());
res.append(": ");
for(int i=0;i<digest.length;i++){
res.append(digest[i]+" ");
}
long endTime = System.currentTimeMillis();
System.out.println(currentThread().getName()+":"+res+"耗时 "+(endTime-beginTime)/1000+"秒");
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
beginTime = System.currentTimeMillis();
for(int i=0;i<args.length;i++){
File f=new File(args[i]);
Thread t=new DigestThread(f);
t.setName("线程"+(i+1));
t.start();
}
System.out.println("main()结束!");
}
}
注意启动程序前设置参数F:/f1.txt F:/f2-4.txt F:/f3.txt F:/f4.txt F:/f5.txt F:/f6.txt F:/f7.txt
读入的单个文件在10M左右为宜,在IO频繁的程序里使用多线程,充分利用CPU空闲时间。
一个比较多线程(并行)和非多线程下完成同等任务(I/O频繁)所需开销的案例
标签:
原文地址:http://blog.csdn.net/hellozpc/article/details/42027539