首页 > 编程语言 > 详细

一个比较多线程(并行)和非多线程下完成同等任务(I/O频繁)所需开销的案例

时间:2014-12-19 14:28:03      阅读:486      评论:0      收藏:0      [点我收藏+]

//非多线程
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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!