Мне нужно прочитать содержимое файлов F1 и F2 и переместить его в новый файл (f3), используя многопоточность в Java. Проблема, с которой я сталкиваюсь, заключается в том, что когда я использую метод synchronized in, я не могу получить ответ, но когда я не синхронизирую метод, я смог получить ответ.
Ниже приведен код с синхронизированным методом, который печатает только содержимое одного файла:
package com.company;
import java.io.*;
import java.io.FileReader;
public class FileMerge{
public static void main(String[] args) throws IOException, InterruptedException {
WriteToFile pc = new WriteToFile();
//Create a Thread1 to read the content of file 1
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
pc.file1();
} catch (InterruptedException | IOException e) {
System.out.println(e);
}
}
});
// Create Thread 2 to read the content of file 2
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
pc.file2();
} catch (InterruptedException | IOException e) {
System.out.println(e);
}
}
});
//Start the Thread
t1.start();
t2.start();
t1.join();
t2.join();
}
public static class WriteToFile{
PrintWriter pw = new PrintWriter("C:/Users/paras.jain/Desktop/des.txt");
public WriteToFile() throws FileNotFoundException {
}
public synchronized void file1() throws InterruptedException, IOException {
// BufferedReader object for file1.txt
BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\paras.jain\\Desktop\\f.txt"));
String line = br.readLine();
//System.out.println("----------" + line);
// loop to copy each line of
// file1.txt to file3.txt
while (line != null) {
pw.println(line);
line = br.readLine();
}
br.close();
pw.close();
}
public synchronized void file2() throws InterruptedException, IOException {
BufferedReader br1 = new BufferedReader(new FileReader("C:/Users/paras.jain/Desktop/f2.txt"));
String line2 = br1.readLine();
//System.out.println("----------" + line2);
// loop to copy each line of
// file2.txt to file3.txt
while (line2 != null) {
pw.println(line2);
line2 = br1.readLine();
//System.out.println("----------" + line2);
}
br1.close();
pw.close();
}
}
}
Вывод приведенного выше кода:
File 1 line 1
File 1 line 2
File 1 line 3
Когда я запустил код метода БЕЗ синхронизации , я получил следующий результат:
File 1 line 1
File 1 line 2
File 2 line 1
File 2 line 2
File 1 line 3
File 2 line 3
Почему такая разница в выводе? И как мне получить второй вывод с помощью метода Synchronized?
1 ответ
Когда методы file1()
и file2()
синхронизируются, один из них должен завершиться, прежде чем другой сможет работать.
Поскольку вы запускаете поток, который первым запускает file1()
, он, скорее всего, выиграет гонку, поэтому file1()
должен завершиться, прежде чем file2()
сможет работать.
К сожалению, file1()
закрывает PrintWriter , поэтому при выполнении file2()
все вызовы pw.println(...)
завершаются с ошибкой .
Почему молча? Потому что так они это определили. См. Javadoc PrintWriter
:
Методы этого класса никогда не вызывают исключения ввода-вывода, хотя некоторые его конструкторы могут. Клиент может узнать, произошли ли какие-либо ошибки, вызвав
checkError()
.
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].