有的时候我们需要利用多线程处理超大文本文件,由于文本很大不能一下读入内存进行处理。
可以利用BufferedReader另外一个构造函数,自定义缓存的大小。每个线程每次读入少量数据,并且可以再对这少量数据进行细分,分多次处理读入缓存的数据。处理缓存数据期间,把reader再交给别的线程读文件。
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class MultiThread implements Runnable{
private static BufferedReader br = null;
private List list;
static{
try {
br = new BufferedReader(new FileReader("F://test.txt"),20);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run() {
String line = null;
int count = 0;
while(true) {
//System.out.println(Thread.currentThread().getName());
this.list = new ArrayList();
synchronized(br) {
try {
while((line = br.readLine()) != null) {
if(count<15) {
//System.out.println(Thread.currentThread().getName()+":"+line);
list.add(line);
count++;
}else {
//System.out.println(Thread.currentThread().getName()+":"+line);
list.add(line);
count = 0;
break;
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
Thread.sleep(1);
display(this.list);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(line == null)
break;
}
}
public void display(List list) {
for(String str:list) {
System.out.println(str);
}
}
public static void main(String args[]) {
MultiThread mt1 = new MultiThread();
MultiThread mt2 = new MultiThread();
Thread td1 = new Thread(mt1,"Tom");
Thread td2 = new Thread(mt2,"Jerry");
td1.start();
td2.start();
}
}