packageedu.thu.xlore.unitId;import java.io.*;importjava.util.ArrayList;importjava.util.concurrent.LinkedBlockingQueue;importjava.util.concurrent.ThreadPoolExecutor;importjava.util.concurrent.TimeUnit;public classTest {public voidunitFile(String filePath){
System.out.println("unitFile start");
ArrayList testArrayList = new ArrayList<>();
File file= newFile(filePath);if (!file.exists()) {return;
}//从txt中读取数据
BufferedReader bufferedReaderRaw = null;try{
bufferedReaderRaw= new BufferedReader(newFileReader(file));int count = 0;while (true) {
String line=bufferedReaderRaw.readLine();if(line == null){break;
}
testArrayList.add(line);
}
}catch(Exception e) {
e.printStackTrace();
}finally{if(bufferedReaderRaw != null) {try{
bufferedReaderRaw.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
System.out.println("unitFile: 读取完毕,数量:" +testArrayList.size());
ArrayList> arrayListArrayList = new ArrayList<>();if(testArrayList.size() < 2000){
arrayListArrayList.add(testArrayList);
}//如果数量大于2000,分割ArrayList进行多线程;
else{for (int i = 0; i < testArrayList.size(); i++) {int num = i / 2000;if (i % 2000 == 0) { //i = 0, 2000, 4000...
arrayListArrayList.add(new ArrayList(2000));
}if (arrayListArrayList.size() == num + 1) {
arrayListArrayList.get(num).add(testArrayList.get(i));
}
}
}
System.out.println("unitFile: 分割数量:" +arrayListArrayList.size());
Long time_start=System.currentTimeMillis();//使用线程池
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 10, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue());for(int i = 0; i < arrayListArrayList.size(); i++){
UnitThread unitThread= newUnitThread(arrayListArrayList, i);
threadPoolExecutor.execute(unitThread);
}
threadPoolExecutor.shutdown();//shutdown线程池会把已经提交的剩余线程执行完然后关闭, shutdownNow是直接关闭执行中的线程返回剩余没执行的线程
while(true) { //等线程全部执行完毕//System.out.println("线程池剩余线程数量:" + threadPoolExecutor.getActiveCount());
if(threadPoolExecutor.isTerminated()) {
System.out.println("线程全部运行完毕");break;
}
}
Long time_end=System.currentTimeMillis();//结果存回txt
FileWriter fileWriter = null;
BufferedWriter bufferedWriter= null;try{
fileWriter= newFileWriter(file);
bufferedWriter= newBufferedWriter(fileWriter);for(int i = 0; i < arrayListArrayList.size(); i++){
System.out.println("共有数据: " +arrayListArrayList.get(i).size());for(int j = 0; j < arrayListArrayList.get(i).size(); j++) {
bufferedWriter.write(arrayListArrayList.get(i).get(j)+ "\n");
}
}
}catch(IOException e) {
e.printStackTrace();
}finally{try{if(fileWriter != null) {
fileWriter.close();
}
}catch(IOException e) {
e.printStackTrace();
}
}
System.out.println("共用时:" + (time_end - time_start) + "毫秒");
}//内部线程类
public class UnitThread extendsThread{private intpageIndex;private ArrayList>arrayListArrayList;public UnitThread(ArrayList> arrayListArrayList, int pageIndex){ //线程不能取得局部变量,只能作为参数传进来,ArrayList是引用变量,所以值可以直接修改,不需要返回结果。
this.pageIndex =pageIndex;this.arrayListArrayList =arrayListArrayList;
}
@Overridepublic voidrun(){
System.out.println("线程" + pageIndex + "开始");
ArrayList unitedCategory =dealwithArrayList(arrayListArrayList.get(pageIndex));
arrayListArrayList.set(this.pageIndex, unitedCategory); //把新的list传回给list集合
System.out.println("线程" + pageIndex + "运行完毕");
}
}public ArrayList dealwithArrayList(ArrayListarrayList){
ArrayList reArrayList = new ArrayList<>();//要对list进行的操作
for(int i = 0 ; i < arrayList.size(); i++){
reArrayList.add(arrayList.get(i)+ " 已经处理完了");
}returnreArrayList;
}public static voidmain(String[] args){
Test test= newTest();
String filePath= "C:\\Users\\Administrator\\Desktop\\test\\wordFile.txt";
test.unitFile(filePath);
}
}