Параллельный метод работает намного дольше, чем простой метод. Зачем? - PullRequest
1 голос
/ 28 мая 2020

Я написал простой метод для чтения одного файла и записи в 2 файла. Также я написал этот метод с 3 потоками, где первый поток считывает файл построчно, второй и третий записывают прочитанную строку в собственный файл. Моя параллельная версия метода работает в 30 раз дольше, чем простой последовательный метод. Помогите, пожалуйста, разобраться, что я делаю не так, и как мне сделать этот метод, чтобы не прострелил ногу)))

private static class Tee {
        private BufferedReader reader;
        private PrintWriter fWriter;
        private PrintWriter sWriter;
        volatile boolean done;
        String buffer;
        volatile int readCount;
        volatile int firstWriteCount;
        volatile int secondWriteCount;

        public Tee(BufferedReader reader, PrintWriter fWriter, PrintWriter sWriter) {
            this.reader = reader;
            this.fWriter = fWriter;
            this.sWriter = sWriter;
        }

        public void teeWhileInsideCo() throws InterruptedException {
            Thread reader = new Thread(new LineReader());
            Thread fWriter = new Thread(new LineWriter(this.fWriter, 0));
            Thread sWriter = new Thread(new LineWriter(this.sWriter, 1));

            reader.start();
            fWriter.start();
            sWriter.start();

            reader.join();
            fWriter.join();
            sWriter.join();
        }

        private class LineReader implements Runnable {

            @Override
            public void run() {
                String line;
                while (true) {
                    try {
                        line = reader.readLine();
                    } catch (IOException e) {
                        line = null;
                    }

                    while (readCount != firstWriteCount || readCount != secondWriteCount) {
                    }

                    if (line == null) {
                        done = true;
                        break;
                    }

                    buffer = line;
                    readCount++;
                }
            }
        }

        private class LineWriter implements Runnable {
            private PrintWriter writer;
            private int number;

            public LineWriter(PrintWriter writer, int n) {
                System.out.println(Tee.this);
                this.writer = writer;
                this.number = n;
            }

            @Override
            public void run() {
                while (true) {
                    while (!done && ((number == 0 ? firstWriteCount : secondWriteCount) == readCount)) {
                    }
                    if (done) {
                        break;
                    }

                    writer.println(buffer);
                    if (number == 0) {
                        firstWriteCount++;
                    } else {
                        secondWriteCount++;
                    }
                }
                writer.flush();
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...