java 多线程读取多个文件 和 不用线程读取多个文件

多线程读取多个文件

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

从结果可以看出,总的运行时间接近所有读取所有文件的时间总和。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值