新公司入职一个多月了,至今没有事情可以做,十来个新同事都一样抓狂,所以大家都自己学习一些新东西,我最近在看zookeeper,感觉蛮不错的,和微服务的zuul以及eureka功能类似,只是代码复杂了一些。而今天,我所要说的是java多线程读取文件的两个例子;

例子1:java多线程批量读取文件

package face.thread.ReadFile;

/**
 * 多线程读、写文件
 * 
 */
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CompareTest3 {
    public static void main(String args[]) {
     long millis1 = System.currentTimeMillis();
     System.out.println(millis1);
     Read3 read = new Read3(millis1);
     ExecutorService service = Executors.newFixedThreadPool(5);
     for(int i = 1; i <= 3; i++){
      service.execute(new Thread(read, "线程" + i)); 
     }
    }
}
 
class Read3 implements Runnable {
 Object o = new Object();
    List<File> filePathsList = new ArrayList<File>();
    int index = 0;
    private long millis ;
    public Read3(long millis1 ) {
     this.millis = millis1;
        File f = new File("d:" + File.separator + "gc2");
        getFileList(f);
    }
 
    private void getFileList(File f) {
        File[] filePaths = f.listFiles();
        for (File s : filePaths) {
            if (s.isDirectory()) {
                getFileList(s);
            } else {
                if (-1 != s.getName().lastIndexOf(".txt")) {
                    filePathsList.add(s);
                }
            }
        }
    }
 
    public void run() {
        File file = null;
        File f2 = null;
        while (index < filePathsList.size()) {
         //此处,保证了多线程不会交叉读取文件

//--1.1方法内的变量是线程安全的
//解释:由于方法内的变量是私有的,本体访问的同时别人访问不了,所以是线程安全的。
//--1.2实例变量是非线程安全的
//解释:由于实例变量可以由多个线程访问,当本体操作变量过程中,别人也可以抢占资源操作变量,使数据不同步了,所以是非线程安全的。

synchronized (o) {
                if (index > filePathsList.size()) {
                    return;
                }
                file = filePathsList.get(index);
                index++;
                //System.out.println("内部index: " + index);
            }

//    System.out.println("文件: " + file.getName());
            FileReader fr = null;
            BufferedReader br = null;
            StringBuffer sb = new StringBuffer();
            
            FileWriter fw  = null;
            BufferedWriter bw = null;
            f2 = new File("d:" + File.separator + "gc3" + File.separator + file.getName());
            
   try {
    fr = new FileReader(file);
       br = new BufferedReader(fr);
       
       fw = new FileWriter(f2);
    bw = new BufferedWriter(fw);
     
       String data = "";
    while((data = br.readLine()) != null){
    // sb.append(data + "\r");
     bw.write(data + "\r");
    }
    
    bw.write("---------------" + Thread.currentThread().getName()+"---------------");
    System.out.println(Thread.currentThread().getName() + " : " + file.getName());
   } catch (FileNotFoundException e) {
    e.printStackTrace();
   } catch (IOException e) {
    e.printStackTrace();
   }finally{
    try {
     bw.close();
     br.close();
     
     /*long millis2 = System.currentTimeMillis();
        System.out.println(millis2);
           System.out.println(millis2 - millis);  //大约1-2ms*/
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
        }
    }
}

例子2:同样的读取文件,改为单线程读取

package face.thread.ReadFile;

/**
 * 单线程读、写文件
 */
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CompareTest4 {
    public static void main(String args[]) {
     
     final long millis1 = System.currentTimeMillis();
     final CyclicBarrier cb = new CyclicBarrier(1,new Runnable(){
            public void run() {
                long millis2 = System.currentTimeMillis();
              System.out.println(millis2);
                System.out.println(millis2 - millis1);  //大约1-2ms
            }
        }); 
     
        
     Read4 read = new Read4(cb);
     ExecutorService service = Executors.newFixedThreadPool(1);
     for(int i = 1; i <= 1; i++){
      service.execute(new Thread(read, "线程" + i)); 
     }
    }
}
 
class Read4 implements Runnable {
  
 Object o = new Object();
    List<File> filePathsList = new ArrayList<File>();
    int index = 0;
    CyclicBarrier cb2;
    public Read4(CyclicBarrier cb) {
     this.cb2 = cb;
        File f = new File("d:" + File.separator + "gc2");
        getFileList(f);
    }
 
    private void getFileList(File f) {
        File[] filePaths = f.listFiles();
        for (File s : filePaths) {
            if (s.isDirectory()) {
                getFileList(s);
            } else {
                if (-1 != s.getName().lastIndexOf(".txt")) {
                    filePathsList.add(s);
                }
            }
        }
    }
 
    public void run() {
        File file = null;
        File f2 = null;
        while (index < filePathsList.size()) {
            synchronized (o) {
                if (index > filePathsList.size()) {
                    return;
                }
                file = filePathsList.get(index);
                index++;
                //System.out.println("内部index: " + index);
            }

//    System.out.println("文件: " + file.getName());
            FileReader fr = null;
            BufferedReader br = null;
            StringBuffer sb = new StringBuffer();
            
            FileWriter fw  = null;
            BufferedWriter bw = null;
            f2 = new File("d:" + File.separator + "gc3" + File.separator + file.getName());
            
   try {
    fr = new FileReader(file);
       br = new BufferedReader(fr);
       
       fw = new FileWriter(f2);
    bw = new BufferedWriter(fw);
     
       String data = "";
    while((data = br.readLine()) != null){
    // sb.append(data + "\r");
     bw.write(data + "\r");
    }
    
    bw.write("---------------" + Thread.currentThread().getName()+"---------------");
   } catch (FileNotFoundException e) {
    e.printStackTrace();
   } catch (IOException e) {
    e.printStackTrace();
   }finally{
    try {
     bw.close();
     br.close();
      try {
      cb2.await();
     } catch (InterruptedException e) {
      e.printStackTrace();
     } catch (BrokenBarrierException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
        }
    }
}

两个例子中,打印的时间即代表线程读取每个代码的时间,性能对比一看就能体现出来,只是个小Demo,望大神勿喷!

 

java多线程批量读取文件(七)的更多相关文章

  1. java多线程批量读取文件( 八)--读写分离

    package com.net.thread.future; import java.io.BufferedReader; import java.io.BufferedWriter; import ...

  2. java多线程批量下载文件

    多线程下载文件 平时开发中有时会用到文件下载,为了提高文件的下载速率,采用多线程下载能够达到事半功倍的效果: package test; /** * 文件下载类 * @author luweichen ...

  3. JAVA多线程下载网络文件

    JAVA多线程下载网络文件,开启多个线程,同时下载网络文件.   源码如下:(点击下载 MultiThreadDownload.java) import java.io.InputStream; im ...

  4. R8—批量生成文件夹,批量读取文件夹名称+R文件管理系统操作函数

    一. 批量生成文件夹,批量读取文件夹名称 今日,工作中遇到这样一个问题:boss给我们提供了200多家公司的ID代码(如6007.7920等),需要根据这些ID号去搜索下载新闻,从而将下载到的新闻存到 ...

  5. 使用Perl批量读取文件最后行

    使用Perl批量读取文件最后行 面对成百上千个文件,有时我们需要查看它的最后行,单个文件打开将耗费大量时间,而通过Perl提取出最后行,将快速的帮助我们处理繁琐的事务. 特性 整个目录完全遍历,自动提 ...

  6. [JAVA 多种方式读取文件]

    package com.file; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream ...

  7. Java相对路径读取文件

    不管你是新手还是老鸟,在程序中读取资源文件总会遇到一些找不到文件的问题,这与Java底层的实现有关,不能算bug,只要方法得当,问题还是可以解决的. 项目的文件夹结构: repathtest ├─sr ...

  8. Java实现批量修改文件名称

    import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; /** ...

  9. 【工具】JAVA 在单元读取文件并比较

    package test20140709; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; ...

随机推荐

  1. 管理员账户权限不足 解决方案 类似没有XXX权限之类的问题解决方法

  2. iOS 时间戳和时间互换,计算两日期相隔天数

    /*  *获取当前系统时间的时间戳  */ +(NSInteger)getNowTimestamp;   /**  * 获取当前时间  */ + (NSString *)getNowTimeTampF ...

  3. AWS的redhat7中安装jdk8

    下载jdk8 wget https://download.oracle.com/otn-pub/java/jdk/8u191-b12/2787e4a523244c269598db4e85c51e0c/ ...

  4. flash系统奔溃的主要原因

    1.内存泄露(内存超过系统允许的最大限制,11.4版本为2G) 2.脚本死循环 3.舞台内元件的大小超出了系统限制

  5. Gremlin--一种支持对图表操作的语言

    Gremlin 是操作图表的一个非常有用的图灵完备的编程语言.它是一种Java DSL语言,对图表进行查询.分析和操作时使用了大量的XPath. Gremlin可用于创建多关系图表.因为图表.顶点和边 ...

  6. Touch事件传递的实验

    通过自定义的Relayout   LinearLayout   TextView , 布局为:     分别打印事件方法: 1.当所有的都是super的时候,点击TextView的时候,事件的传递是: ...

  7. nginx配置https服务器

    方法一 1.创建证书 #cd /usr/local/nginx/conf #openssl genrsa -des3 -out server.key 1024 #openssl req -new -k ...

  8. MATLAB/OCTAVE常用命令 cheat sheet

    MATLAB cheatsheet http://web.mit.edu/18.06/www/Spring09/matlab-cheatsheet.pdf 清除变量 clear 清屏 clc //cl ...

  9. May 6th 2017 Week 18th Saturday

    A great ship asks deep water. 巨轮寻深水而航行. A great ship needs deep water so as to get enough buoyancy t ...

  10. frame、window和dialog区别

    属性 Window Frame Dialog 模式化 不是 不是 不是(可设置) 可调大小 不可 可 可 标题栏 无 有 有 边界 无 有 有 标题 无 有 有 菜单栏 无 有 无 焦点管理器 有 有 ...