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

//非多线程
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空闲时间。

时间: 2024-10-29 02:43:01

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

并行编程之多线程共享非volatile变量,会不会可能导致线程while死循环

背景 大家都知道线程之间共享变量要用volatile关键字.但是,如果不用volatile来标识,会不会导致线程死循环?比如下面的伪代码: static int flag = -1; void thread1(){ while(flag > 0){ //wait or do something } } void thread2(){ //do something flag = -1; } 线程1,线程2同时运行,线程2退出之后,线程1会不会有可能因为缓存等原因,一直死循环? 真实的世界 第一个坑

iOS开发--多线程 并行开发

概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种状况可以从两个角度出发:对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其他后续任务在其他线程中,当CPU空闲时会继续执行,而此时对于用户而言可以继续进行其他操作:对于多核处理器,如果用户在UI线程中完成某个操作之后,其他后续操作在别的线程

C#中的多线程 - 并行编程 z

原文:http://www.albahari.com/threading/part5.aspx 专题:C#中的多线程 1并行编程Permalink 在这一部分,我们讨论 Framework 4.0 加入的多线程 API,它们可以充分利用多核处理器. 并行 LINQ(Parallel LINQ)或称为 PLINQ Parallel类 任务并行(task parallelism)构造 SpinLock 和 SpinWait 这些 API 可以统称为 PFX(Parallel Framework,并行

NET中的并行编程(TPL)——多线程、异步、任务和并行计算

https://masuit.com/1201 谈一谈.NET中的并行编程(TPL)——多线程.异步.任务和并行计算 懒得勤快 发表于2018-04-26 19:41:00 | 最后修改于2018-06-27 23:44:40 .NET 多线程 异步 高并发 分类:.NET开发技术 | 评论总数:0条 | 热度:2243℃ 我要编辑 写在前面: 在做了几个月的高并发项目的过程中,其实发现自己真的提升了不少,所以也想把这段时间的收获分享给大家,然后写这篇文章发现,写下来是一发不可收拾,所以这篇文章

C++11 并发编程基础(一):并发、并行与C++多线程

正文 C++11标准在标准库中为多线程提供了组件,这意味着使用C++编写与平台无关的多线程程序成为可能,而C++程序的可移植性也得到了有力的保证.另外,并发编程可提高应用的性能,这对对性能锱铢必较的C++程序员来说是值得关注的. 回到顶部 1. 何为并发 并发指的是两个或多个独立的活动在同一时段内发生.生活中并发的例子并不少,例如在跑步的时候你可能同时在听音乐:在看电脑显示器的同时你的手指在敲击键盘.这时我们称我们大脑并发地处理这些事件,只不过我们大脑的处理是有次重点的:有时候你会更关注你呼吸的

并发、并行与C++多线程——基础一

1.什么是并发? 并发指的是两个或多个独立的活动在同一时段内发生.生活中并发的例子并不少,例如在跑步的时候你可能同时在听音乐:在看电脑显示器的同时你的手指在敲击键盘.这时我们称我们大脑并发地处理这些事件,只不过我们大脑的处理是有次重点的:有时候你会更关注你呼吸的频率,而有时候你更多地被美妙的音乐旋律所吸引.这时我们可以说大脑是一种并发设计的结构.这种次重点在计算机程序设计中,体现为某一个时刻只能处理一个操作. 2.什么是并行? 与并发相近的另一个概念是并行.它们两者存在很大的差别.并行就是同时执

java8新特性(六):Stream多线程并行数据处理

转:http://blog.csdn.net/sunjin9418/article/details/53143588 将一个顺序执行的流转变成一个并发的流只要调用 parallel()方法 public static long parallelSum(long n){    return Stream.iterate(1L, i -> i +1).limit(n).parallel().reduce(0L,Long::sum); } 并行流就是一个把内容分成多个数据块,并用不不同的线程分别处理每

[.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(三) 利用多线程提高程序性能(下)

[.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(二) 利用多线程提高程序性能(下) 本节导读: 上节说了线程同步中使用线程锁和线程通知的方式来处理资源共享问题,这些是多线程的基本原理. .NET 4.0以后对多线程的实现变得更简单了. 本节主要讨论.NET4.0多线程的新特性——使用Task类创建多线程. 读前必备: A. LINQ使用  [.net 面向对象编程基础] (20) LINQ使用 B. 泛型          [.net 面向对象编程基础] (

python之多线程执行和非线程执行的对比

一.非线程执行(普通的执行) 1.非线程运行,简单代码如下 #_*_coding:utf-8_*_ import time import threading a = [] b = [] def func1():     print "func1 start %s" % time.ctime()     alist = ["192.168.1.100","192.168.1.120","192.168.1.134","