У меня проблема с синхронизированным чтением моего файла. Случай прост: обрабатывать данные в файле. Моя проблема - синхронизация. Я пытаюсь сделать это на объектном читателе класса BufferedReader, но у меня две проблемы. Если я инициализирую читателя в «try with resourses» моего метода read(), я перейду к различным объектам BufReader для одного и того же объекта, когда буду использовать его в разных ададах. Второй я инициализирую его в классе и получаю тот же объект для потоков, но большую проблему с исключениями и непредсказуемым поведением. Я напишу код для второй ситуации. Можете ли вы посоветовать мне, как решить. Я сейчас учусь, вот почему я хочу советов.Проблемы многопоточности Java
class FileReaderClass {
private File file = new File("src\\exer1\\Transfers.txt");
private BufferedReader reader = null;
private FileReader fr = null;
StringBuilder sb = new StringBuilder();
void read() throws IOException {
try {
fr = new FileReader(file);
reader = new BufferedReader(fr);
String buftext;
while ((buftext = reader.readLine()) != null){
synchronized (reader) {
System.out.println(Thread.currentThread().getName());//for testing
sb.append(buftext).append("\n");
//System.out.println(buftext);
}
}
}
catch (IOException e) {
e.printStackTrace();
}
finally {
if (reader != null)
reader.close();
if (fr != null)
fr.close();
}
}
}
class Reader1 implements Runnable {
private FileReaderClass frc;
public Reader1(FileReaderClass frc) {
this.frc = frc;
}
@Override
public void run() {
try {
frc.read();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class Ex1 {
public static void main(String[] args) throws InterruptedException {
FileReaderClass frc = new FileReaderClass();
Thread t1 = new Thread(new Reader1(frc));
Thread t2 = new Thread(new Reader2(frc));
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("---------------------");
System.out.println(frc.sb);
}
}
Что вы хотите сделать? У вас есть только один открытый файл? Только один читается для одного и того же файла одновременно? –
Да, я хочу только читать сейчас. Другая логика - следующий шаг. Но я хочу прочитать так, чтобы одна строка из файла была прочитана и записана в Stringbuilder за один раз. И я хочу сделать его параллельным в нескольких потоках. Случай параллельной обработки файла. –
В этом случае, @ Selçuk Cihan является правильным. синхронизация отсутствует. Вы можете пойти с помощью try-with-resource. Каждый созданный FileReaderClass будет иметь свой собственный FileReader, и он хочет, чтобы вы захотели. Но чтобы иметь параллельную обработку файла, я думаю, что ваши читатели файлов должны читать другую часть файла, и вам придется конкатенировать конечные результаты. Это имеет смысл. –