Лучше всего использовать шаблон потребления производителя. Нити производителя будут читать файлы и отправлять контент потребителю, обернув его в каком-то классе. Который напишет объединенный файл на диск.
На стороне потребителя вы можете использовать очередь приоритетов и позволить производителю установить приоритет.
Ну, здесь много ненужного дублирования кода.
Каждый экземпляр MultiFileReadingThread должен иметь собственный читатель и писатель, который никогда не доступен извне потока. Кажется, что у вас есть несколько потоков, использующих один и тот же сценарий, в этом случае это не получится очень хорошо.
Попробуйте следующее:
public MultiFileReadingThread(String name, List<File> inputFiles, File outputFile) {
this.writer = new BufferedWriter(new FileWriter(outputFile));
this.name = name;
this.files = inputFiles;
}
@Override
public void run() {
SimpleDateFormat formatter = new SimpleDateFormat("dd/mm/yyyy hh:mm:ss:ms");
System.out.println("Start Time : " + name + formatter.format(System.currentTimeMillis()));
//readFile();
if(i == 1){
}
writeIntoSharedBufferedWriter();
System.out.println("End Time : " + name + formatter.format(System.currentTimeMillis()));
}
public void writeIntoBufferedWriter(){
for(File f : files){
try{
BufferedReader r = new BufferedReader(new FileReader(f));
String line = null;
while((line = r.readLine()) != null){
writer.write(line);
writer.write("\n");
}
} catch(Exception ex){
ex.printStackTrace();
}
}
}
Не забывайте, что вы Также вам нужно закрыть BufferedReader и BufferedWriter.
Threading может быть трудным и, к сожалению, нет единого учебника или ресурса для предоставления всей необходимой вам информации. Я предлагаю прочитать каждый, который вы можете найти, несколько раз. Попытка реализовать многопоточность, прежде чем у вас будет сильное понимание предмета, может привести к множеству проблем. Иногда проблемы с резьбой не проявляются до конца жизненного цикла приложений, когда для их исправления требуются значительные изменения.