Сортировка файлов с использованием многопоточного чтения в JavaJAVA

Программисты JAVA общаются здесь
Anonymous
Сортировка файлов с использованием многопоточного чтения в Java

Сообщение Anonymous »

мне дали назначение для написания всех упорядоченных содержимого данных файлов в result.txt. Сначала имена файлов разделяются на разные массивы, где каждый файл содержит метку в формате #N/N, где n - общее количество файлов. Например. С моим кодом он написал в порядке 1,4,2,3 соответственно. Однако результат должен быть в порядке 1,2,3,4. Это может быть связано с отсутствием синхронизации. Тем не менее, я все еще изо всех сил пытаюсь решить проблему. < /P>
Это мой код: < /p>

Код: Выделить всё

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.*;

class PopThread implements Runnable {
ArrayList fileList;

public PopThread(ArrayList fileList) {
this.fileList = fileList;
}

@Override
public void run() {
//System.out.println("running\n");

Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
long startTime = System.nanoTime();

System.out.println("fileList: " + fileList);

ArrayList sortedFileList = sortFiles(fileList);

File resultFile = new File("result.txt");

for (String filename : sortedFileList) {
Writer w1 = new Writer(filename, resultFile);
Thread t = new Thread(w1);
t.setPriority(Thread.MAX_PRIORITY);
t.start();
}

long stopTime = System.nanoTime();
//System.out.println("Total execution time: " + (stopTime - startTime));
}

public ArrayList readFiles(String filename) {
ArrayList list = new ArrayList();

try {
File myObj = new File(filename);
Scanner s = new Scanner(myObj);

while (s.hasNext()) {
list.add(s.next());
}

s.close();

} catch (FileNotFoundException e) {
e.printStackTrace();
}
return list;
}

public int getNumber(String filename) {
String lastLine = "";
String sCurrentLine;

int identifier_integer = -1;

try {
BufferedReader br = new BufferedReader(new FileReader(filename));

while ((sCurrentLine = br.readLine()) != null) {
lastLine = sCurrentLine;
}

String identifier_number = lastLine.substring(1,4);
identifier_integer = Integer.parseInt(identifier_number);

} catch (FileNotFoundException e) {
e.printStackTrace();
}

catch (IOException e) {
e.printStackTrace();
}

return identifier_integer;

}

public ArrayList sortFiles(ArrayList listFileName) {
int i = listFileName.size();
boolean sorted = false;

while ( (i > 1)  &&  (!(sorted)) ) {
sorted = true;

for (int j = 1; j < i; j++) {
if ( getNumber(listFileName.get(j-1)) >  getNumber(listFileName.get(j)) ) {
String temp = listFileName.get(j-1);
listFileName.set(j-1, listFileName.get(j));
listFileName.set(j, temp);

sorted = false;
}
}
i--;
}

return listFileName;
}

}

class Writer implements Runnable {
String filename;
File resultFile;

public Writer(String filename, File resultFile) {
this.filename = filename;
this.resultFile = resultFile;
}

@Override
public void run() {
String content;
content = readFromFile(filename);
writeToFile(resultFile, content);
}

private static void writeToFile(File resultFile, String content) {
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(resultFile, true));
writer.write(content);
//writer.write("file content written");
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
}

static String readFromFile(String filename) {
StringBuffer content = new StringBuffer();

try {
String text;
BufferedReader reader = new BufferedReader(new FileReader(filename));

while ((text = reader.readLine()) != null) {
content.append(text);
content.append("\n");
}

} catch (FileNotFoundException e) {
e.printStackTrace();
}

catch (IOException e) {
e.printStackTrace();
}

return content.toString();
}

}

public class q4 {
public static void main(String[] args) {
ArrayList filesOne = new ArrayList();
filesOne.add("1831-06-01.txt");
filesOne.add("2003-08-27.txt");

ArrayList filesTwo = new ArrayList();
filesTwo.add("1961-04-12.txt");
filesTwo.add("1972-12-11.txt");

PopThread popRunnableOne = new PopThread(filesOne);
PopThread popRunnableTwo = new PopThread(filesTwo);

Thread threadOne = new Thread(popRunnableOne);
Thread threadTwo = new Thread(popRunnableTwo);

threadOne.start();
threadTwo.start();
try {
threadOne.join();
threadTwo.join();
} catch (InterruptedException e) {
e.printStackTrace();
}

}

}
(примечание: класс Q4 не может быть изменен).

Подробнее здесь: https://stackoverflow.com/questions/717 ... ng-in-java

Вернуться в «JAVA»