多线程读取多个文件
package thread;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.concurrent.CountDownLatch;
public class ReadMultiFilesByThread {
/**
* @param args
*/
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
final int thNum = 4;
final String filePath3 = "C:\\Users\\IBM_ADMIN\\Downloads\\马达加斯加3全篇英文台词3.txt"; //266M
final String filePath2 = "C:\\Users\\IBM_ADMIN\\Downloads\\马达加斯加3全篇英文台词2.txt"; //186M
final String filePath = "C:\\Users\\IBM_ADMIN\\Downloads\\马达加斯加3全篇英文台词.txt"; //39KB
final String filePath4 = "C:\\Users\\IBM_ADMIN\\Downloads\\carootcert(1).der"; //1KB
CountDownLatch doneSignal = new CountDownLatch(thNum);
ReadFileThread2 r1 = new ReadFileThread2(doneSignal,filePath);
ReadFileThread2 r2 = new ReadFileThread2(doneSignal,filePath2);
ReadFileThread2 r3 = new ReadFileThread2(doneSignal,filePath3);
ReadFileThread2 r4 = new ReadFileThread2(doneSignal,filePath4);
r1.start();
r2.start();
r3.start();
r4.start();
try {
doneSignal.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println("===============================");
System.out.println("The totally executed time: "+(endTime-startTime));
}
}
class ReadFileThread2 extends Thread{
private RandomAccessFile raf;
private CountDownLatch doneSignal;
private final int bufLen = 256;
private String path;
public ReadFileThread2(CountDownLatch doneSignal,String path){
this.doneSignal = doneSignal;
this.path = path;
}
@Override
public void run() {
long start = System.currentTimeMillis();
try {
raf = new RandomAccessFile(path,"rw");
raf.seek(0);
long contentLen = new File(path).length();
long times = contentLen / bufLen +1;
byte []buff = new byte[bufLen];
int hasRead = 0;
String result = null;
for(int i=0;i<times;i++){
hasRead = raf.read(buff);
if(hasRead < 0){
break;
}
result = new String(buff,"gb2312");
}
doneSignal.countDown();
} catch (IOException e) {
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println(getName() + " " + path +" total Time: " + (end - start));
}
}
程序部分说明:
分别创建4个线程,读取四个不同大小的文件。
分别计算读取每个文件的时间,然后得到读取4个文件的总时间。
java.util.concurrent.CountDownLatch
一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
await()使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。
countDown()递减锁存器的计数,如果计数到达零,则释放所有等待的线程。
线程执行完读取文件的操作,然后锁存器减一,当4个线程都执行读取文件的操作后,锁存器计数为0,执行await方法后,输出总的读取时间。
加入CountDownLatch 是为了让子线程分别读取完文件后,主线程才能把总的读取时间输出。否则会造成主线程一早就计算时间。
运行结果:
Thread-8 C:\Users\IBM_ADMIN\Downloads\carootcert(1).der total Time: 8
Thread-5 C:\Users\IBM_ADMIN\Downloads\马达加斯加3全篇英文台词.txt total Time: 28
Thread-6 C:\Users\IBM_ADMIN\Downloads\马达加斯加3全篇英文台词2.txt total Time: 4051
Thread-7 C:\Users\IBM_ADMIN\Downloads\马达加斯加3全篇英文台词3.txt total Time: 5190
===============================
The totally executed time: 5194
从结果可以看出,总的运行时间接近那个读取最大文件所用的时间。
===================================
不用线程读取多个文件
package thread;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
public class ReadMultiFilesWithoutThread {
/**
* @param args
*/
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
ReadMultiFilesWithoutThread read = new ReadMultiFilesWithoutThread();
final String filePath3 = "C:\\Users\\IBM_ADMIN\\Downloads\\马达加斯加3全篇英文台词3.txt"; //266M
final String filePath2 = "C:\\Users\\IBM_ADMIN\\Downloads\\马达加斯加3全篇英文台词2.txt"; //186M
final String filePath = "C:\\Users\\IBM_ADMIN\\Downloads\\马达加斯加3全篇英文台词.txt"; //39KB
final String filePath4 = "C:\\Users\\IBM_ADMIN\\Downloads\\carootcert(1).der"; //1KB
read.readFile(filePath);
read.readFile(filePath2);
read.readFile(filePath3);
read.readFile(filePath4);
long endTime = System.currentTimeMillis();
System.out.println("===============================");
System.out.println("The totally executed time: "+(endTime-startTime));
}
public void readFile(String path){
long start = System.currentTimeMillis();
int bufLen = 256;
try {
RandomAccessFile raf = new RandomAccessFile(path,"rw");
raf.seek(0);
long contentLen = new File(path).length();
long times = contentLen / bufLen +1;
byte []buff = new byte[bufLen];
int hasRead = 0;
String result = null;
for(int i=0;i<times;i++){
hasRead = raf.read(buff);
if(hasRead < 0){
break;
}
result = new String(buff,"gb2312");
}
} catch (IOException e) {
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println( path +" total Time: " + (end - start));
}
}
程序部分说明:
分别读取4个大小不同的文件,计算读取每个文件所需的时间。
计算总共的时间。
运行结果:
:\Users\IBM_ADMIN\Downloads\马达加斯加3全篇英文台词.txt total Time: 17
C:\Users\IBM_ADMIN\Downloads\马达加斯加3全篇英文台词2.txt total Time: 2983
C:\Users\IBM_ADMIN\Downloads\马达加斯加3全篇英文台词3.txt total Time: 3794
C:\Users\IBM_ADMIN\Downloads\carootcert(1).der total Time: 1
===============================
The totally executed time: 6795
从结果可以看出,总的运行时间接近所有读取所有文件的时间总和。