Мне нужно прочитать содержимое файлов 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
Paras jain 23 Окт 2019 в 18:17

1 ответ

Лучший ответ

Когда методы file1() и file2() синхронизируются, один из них должен завершиться, прежде чем другой сможет работать.

Поскольку вы запускаете поток, который первым запускает file1(), он, скорее всего, выиграет гонку, поэтому file1() должен завершиться, прежде чем file2() сможет работать.

К сожалению, file1() закрывает PrintWriter , поэтому при выполнении file2() все вызовы pw.println(...) завершаются с ошибкой .

Почему молча? Потому что так они это определили. См. Javadoc PrintWriter :

Методы этого класса никогда не вызывают исключения ввода-вывода, хотя некоторые его конструкторы могут. Клиент может узнать, произошли ли какие-либо ошибки, вызвав checkError().

3
Andreas 23 Окт 2019 в 15:26