多线程读文件

如果多线程读同一文件,其实和一个线程是一样的,

所以要把文件按不同机能分开,每个线程读属于自己的文件。

import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

-----------------------------------------------------------------------------------------------------------
public class MyMainThread {


public static void main(String[] args) {
//固定数量的线程池
        ExecutorService pool = Executors.newFixedThreadPool(4);
        LocalTime time1 = LocalTime.now(); 
        //保存执行线程
        List<SingleThread> tasks = new ArrayList<SingleThread>();
        for (int i = 1; i <= 20; i++) {
        SingleThread st = new SingleThread(String.valueOf(i));
        tasks.add(st);
        }
        try {  
        //超过时限后,任务尚未完成的任务都会被取消。
        List<Future<FileInfo>> futureList = pool.invokeAll(tasks, 100, TimeUnit.SECONDS);  
        LocalTime time2 = LocalTime.now(); 
        System.out.println("local time now1 : " + time1);
        System.out.println("local time now2 : " + time2);
        FileInfo fi = null;
            for(Future<FileInfo> future : futureList) {
                try { 
                    if (!future.isCancelled() && future.isDone()) {
                    fi = future.get();
                        //System.out.println("result " + fi.getId() + " " + fi.getName()+ " " + fi.getSex());  
                    } else {
                    //System.out.println("任务被取消!!->"+fi.getId());  
                    }
                } catch (CancellationException ex) {  
                    ex.printStackTrace();  
                }  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {
        //关闭线程池
            pool.shutdown();
        }
    }
}

-----------------------------------------------------------------------------------------------------------
import java.util.concurrent.Callable;


public class SingleThread implements Callable<FileInfo>{

private String threadId = "";

    public SingleThread(String threadId) {
    this.threadId = threadId;
    }
    
@Override
public FileInfo call() throws Exception {
//在这里实现业务逻辑
System.out.println("start:"+threadId);
FileUtil fu = new FileUtil(threadId);
fu.readLinesFromFile();
System.out.println("end:"+threadId);
return null ;
}
}

-------------------------------------------------------------------------------------------------------

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.stream.Stream;

public class FileUtil {

  private String id = "";
  
  public FileUtil(String id){
 this.id = id;
  }
  public void readLinesFromFile() {
    BufferedReader br = null;
    try {
    String fn = "d://tt" + id + ".txt";
//构造BufferedReader对象
   br = new BufferedReader(new FileReader(fn));
   //只能用一次,第二次就没有了
   Stream<String> stream = br.lines();
   stream.forEach(x->System.out.println(id + "->" + x));
    }
    catch (IOException e) {
      e.printStackTrace();
    }
    finally {
      //关闭BufferedReader
      if (br != null) {
        try {
          br.close();
          br = null;
        }
        catch (IOException e) {
          e.printStackTrace();
          br = null;
        }
      }
    }
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值