多线程读取文件.docx
- 文档编号:15776955
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:10
- 大小:15.73KB
多线程读取文件.docx
《多线程读取文件.docx》由会员分享,可在线阅读,更多相关《多线程读取文件.docx(10页珍藏版)》请在冰点文库上搜索。
多线程读取文件
单线程读取10K个文件的话会显的非常的慢,但是如果我们开启多个线程去读取,会让读取的速度大大的加快,顺便说一下多线程的注意事项:
synchronized代码快中尽量简短,不要有类似socket.accept()inputstream.read()这样的阻塞式的方法,这样会让程序减慢,如果synchronized代码快中的东西太多,容易造成单线程的囧地,而且速度还不如单线程快。
废话少说,我们来看看代码:
------------------------
1.生成10K个文件:
packagecom.fileThread;
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.OutputStream;
publicclassGenFile{
/**
*@paramargs
*@throwsException
*/
publicstaticvoidmain(String[]args)throwsException{
Filefile=null;
OutputStreamout=null;
file=newFile("c:
/file");
if(!
file.exists()){
file.mkdirs();
}
for(inti=0;i<10000;i++){
file=newFile("c:
/file/file"+i+".txt");
out=newFileOutputStream(file);
out.write("nihao1hh1hh1".getBytes());
out.close();
}
file=null;
out=null;
}
}
------------------------多线程读取
packagecom.fileThread;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.IOException;
importjava.io.InputStream;
publicclassReadFile{
publicstaticvoidmain(String[]args)throwsException{
Sumsum=newSum();
Threadt1=newThread(sum);
Threadt2=newThread(sum);
Threadt3=newThread(sum);
t1.start();
t2.start();
t3.start();
//t1.run();
//t2.run();
//t3.run();
//System.out.println(sum.getSum()+"==");
}
}
classSumimplementsRunnable{
privateIntegeri=0;
privateIntegersum=0;
staticlongtime;
publicvoidrun(){
Filefile=null;
InputStreamis=null;
StringBuffersb=null;
while(true){
if(i==0){
time=System.currentTimeMillis();
}
if(i==10000){
break;
}
synchronized(this){
file=newFile("c:
/file/file"+i+".txt");
//System.out.println(i+"currentThread=="+
//Thread.currentThread().getName());
i++;
}
try{
is=newFileInputStream(file);
}catch(FileNotFoundExceptione){
}
byte[]data=newbyte[2048];
intlen=0;
sb=newStringBuffer();
try{
while((len=is.read(data))!
=-1){
sb.append(newString(data,0,len));
}
}catch(IOExceptione){
}
Stringresult=sb.toString();
String[]arr=result.split("\\D+");
synchronized(this){
for(Strings:
arr){
if(s!
=null&&s.trim().length()>0){
sum+=Integer.parseInt(s);
}
}
}
}
file=null;
sb=null;
is=null;
System.out.println(this.sum);
System.out.println(System.currentTimeMillis()-time);
}
publicIntegergetI(){
returni;
}
publicvoidsetI(Integeri){
this.i=i;
}
publicIntegergetSum(){
returnsum;
}
publicvoidsetSum(Integersum){
this.sum=sum;
}
}
-------------------------所有的东西都放到synchronazied代码快中的速度比较,这个类似单线程
packagecom.fileThread;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.IOException;
importjava.io.InputStream;
publicclassReadFileAll{
publicstaticvoidmain(String[]args)throwsException{
Sumssum=newSums();
Threadt1=newThread(sum);
Threadt2=newThread(sum);
Threadt3=newThread(sum);
t1.start();
t2.start();
t3.start();
//22562
//14625
}
}
classSumsimplementsRunnable{
privateIntegeri=0;
privateIntegersum=0;
staticlongtime;
publicvoidrun(){
Filefile=null;
InputStreamis=null;
StringBuffersb=null;
while(true){
if(i==0){
time=System.currentTimeMillis();
}
if(i==10000){
break;
}
synchronized(this){
file=newFile("c:
/file/file"+i+".txt");
// System.out.println(i+"currentThread=="
// +Thread.currentThread().getName());
i++;
try{
is=newFileInputStream(file);
}catch(FileNotFoundExceptione){
}
byte[]data=newbyte[2048];
intlen=0;
sb=newStringBuffer();
try{
while((len=is.read(data))!
=-1){
sb.append(newString(data,0,len));
}
}catch(IOExceptione){
}
Stringresult=sb.toString();
String[]arr=result.split("\\D+");
for(Strings:
arr){
if(s!
=null&&s.trim().length()>0){
sum+=Integer.parseInt(s);
}
}
}
}
file=null;
sb=null;
is=null;
System.out.println(this.sum);
System.out.println(System.currentTimeMillis()-time);
}
publicIntegergetI(){
returni;
}
publicvoidsetI(Integeri){
this.i=i;
}
publicIntegergetSum(){
returnsum;
}
publicvoidsetSum(Integersum){
this.sum=sum;
}
}
-------------------------------单线程去读的速度:
packagecom.fileThread;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.IOException;
importjava.io.InputStream;
publicclassReadFileSingleThread{
publicstaticvoidmain(String[]args)throwsException{
inti=0;
longtime=0;
intsum=0;
Filefile=null;
InputStreamis=null;
StringBuffersb=null;
while(true){
if(i==0){
time=System.currentTimeMillis();
}
if(i==10000){
break;
}
file=newFile("c:
/file/file"+i+".txt");
i++;
try{
is=newFileInputStream(file);
}catch(FileNotFoundExceptione){
}
byte[]data=newbyte[2048];
intlen=0;
sb=newStringBuffer();
try{
while((len=is.read(data))!
=-1){
sb.append(newString(data,0,len));
}
}catch(IOExceptione){
}
Stringresult=sb.toString();
String[]arr=result.split("\\D+");
for(Strings:
arr){
if(s!
=null&&s.trim().length()>0){
sum+=Integer.parseInt(s);
}
}
}
file=null;
sb=null;
is=null;
System.out.println(sum);
System.out.println(System.currentTimeMillis()-time);
}
}
-------------------
通过比较,大家就可以发现多线程的好处了,可能大家多如何写多线程存在疑问,这里我想说的是多想想,你的多线程是想做什么,就像这个例子,我的多线程就是想每个人线程分担不同的文件读取,再算总和,所以我要控制的同步资源就是文件的名称和总和,所以我就需要把这两个属性同步上,这样就可以。
如何返回多线程执行完的结果呢,我个人认为这样做,是让其他线程在mian之前完成,这样就可以达到效果,可以用thread.join()方法,这样在执行mian之前就会先把多线程执行完,就可以的到结果。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多线程 读取 文件
![提示](https://static.bingdoc.com/images/bang_tan.gif)