如果多线程读同一文件,其实和一个线程是一样的,
所以要把文件按不同机能分开,每个线程读属于自己的文件。
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;
}
}
}
}
}