Операции над файлом с многопоточностью - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь работать с многопоточностью и хочу написать код, который должен выполнять некоторые операции с определенным файлом с именем data.txt.

Должно быть три пишущих и три читателя, а писатель 1 имеетчтобы написать случайный символ от A до Z, писатель 2 должен написать случайное число от 1 до 100, писатель 3 должен написать случайный символ из этого набора символов {*%$#@!&casts.

Затем читатели должны прочитать символ из файла data.txt, а затем читатель 1 записать этот символ в файл 1.txt, читатель 2 записать этот символ в файл 2.txt и читатель 3 записать этот символ в файл 3.txt.

Если в файле данных не было символов для чтения, читатели должны подождать, пока авторы не добавят что-либо в файл данных.

Я написал два класса, называемых WriterInFile и ReaderFromFile, которые расширяют класс Thread, но этокажется, что ReaderFromFile не работает правильно (он не читает символы из файла данных и ничего не добавляет в файлы 1.txt, 2.txt, 3.txt)

ЭтоКод для класса ReaderFromFile:

import java.io.*;

public class ReaderFromFile extends Thread {
    private static FileReader reader;
    private int numberOfReader;


    ReaderFromFile(int numberOfReader, FileReader reader) {
        this.numberOfReader = numberOfReader;
        ReaderFromFile.reader = reader;
    }

    public void run() {
        for (int i = 0; i < 5; i++) {
            String s = null;
            try {
                s = readFrom();
        } catch (IOException e) {
            e.printStackTrace();
        }
        FileWriter writer;
        switch (numberOfReader) {
            case 1:
                try {
                    writer = new FileWriter("1.txt",true);
                    if (s != null) {
                        writer.write(s);
                    }
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                break;
            case 2:
                try {
                    writer = new FileWriter("2.txt",true);
                    if (s != null) {
                        writer.write(s);
                    }
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                break;
            case 3:
                try {
                    writer = new FileWriter("3.txt",true);
                    if (s != null) {
                        writer.write(s);
                    }
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                break;
        }
    }
}

/**
 * @return the character that has been reed
 */
private synchronized String readFrom() throws IOException {
    String s = null;
    while (!reader.ready()) {
        try {
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    try {
        s = String.valueOf(reader.read());
    } catch (IOException e) {
        e.printStackTrace();
    }
    notifyAll();
    return s;
}


}

Это класс WriterInFile:

import java.io.FileWriter;
import java.io.IOException;
import java.util.Random;

public class WriterInFile extends Thread {
private static FileWriter writer;
private int numberOfReader;

WriterInFile(int numberOfReader, FileWriter writer) {
    this.numberOfReader = numberOfReader;
    WriterInFile.writer = writer;
}

public void run() {
    for (int i=0;i<5;i++){
        try {
            sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        switch (numberOfReader) {
            case 1:
                writeChar();
                break;
            case 2:
                writeNumber();
                break;
            case 3:
                writeShape();
                break;
        }
    }
}


private synchronized void writeChar() {
    String s = getRandomChar();
    try {
        writer.write(s);
        System.out.println(s);
    } catch (IOException e) {
        e.printStackTrace();
    }
    notifyAll();
}

private synchronized void writeNumber() {
    String s = getRandomNumber();
    try {
        writer.write(s);
        System.out.println(s);
    } catch (IOException e) {
        e.printStackTrace();
    }
    notifyAll();
}

private synchronized void writeShape() {
    String s = getRandomShape();
    try {
        writer.write(s);
        System.out.println(s);
    } catch (IOException e) {
        e.printStackTrace();
    }
    notifyAll();
}

private String getRandomChar() {
    double randomDouble = Math.random();
    randomDouble = randomDouble * 26;
    int randomInt = (int) randomDouble;
    return String.valueOf((char)(randomInt+'A'));
}

private String getRandomNumber() {
    double randomDouble = Math.random();
    randomDouble = randomDouble * 100 + 1;
    int randomInt = (int) randomDouble;
    return String.valueOf(randomInt);
}


private String getRandomShape() {
    String chars = "*%$#@!&";
    Random rnd = new Random();
    char randomChar = chars.charAt(rnd.nextInt(chars.length()));
    return String.valueOf(randomChar);
}
}

и это основной файл:

public static void main(String[] args) {

        try {
            FileWriter writer = new FileWriter("data.txt");
            FileReader reader = new FileReader("data.txt");
            //creating writers
            WriterInFile writer1 = new WriterInFile(1, writer);
            WriterInFile writer2 = new WriterInFile(2, writer);
            WriterInFile writer3 = new WriterInFile(3, writer);
            // creating readers
            ReaderFromFile reader1 = new ReaderFromFile(1, reader);
            ReaderFromFile reader2 = new ReaderFromFile(2, reader);
            ReaderFromFile reader3 = new ReaderFromFile(3, reader);

            writer1.start();
            writer2.start();
            writer3.start();

            reader1.start();
            reader2.start();
            reader3.start();
            Thread.sleep(10000);
            writer.close();
            reader.close();
    } catch (IOException | InterruptedException e) {
        e.printStackTrace();
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...