Записывать данные в текстовый файл в несколько потоков (одновременно, в разных строках файла) - PullRequest
0 голосов
/ 05 августа 2020

Создайте k потоков, которые одновременно записывают символы в один и тот же файл:

  • первый поток записывает di git 0 ровно 20 раз в первую строку файла;
  • второй поток записывает di git 1 ровно 20 раз во вторую строку файла;

...

  • десятый поток записывает di git 9 ровно 20 раз в десятую строку файла;

Требования к реализации.

  1. Требуется установить паузу в 1 миллисекунду для записи каждого di git.

  2. Используйте RandomAccessFile для записи данных в файл.

  3. Вы можете использовать не более одного объекта класса RandomAccessFile!

Я написал примерно так:

import java.io.IOException;
import java.io.RandomAccessFile;

public class Part5 {
    // creates string before writing to the file
    public static String createString(int integer){
        StringBuilder result = new StringBuilder("");

        for(int i = 0; i < 20; i++){
            result.append(integer);
        }

        result.append("\n");
        return result.toString();
    }
    // writes string into the file
    public static void writeString(String st) {
        try(RandomAccessFile file = new RandomAccessFile("part5.txt", "rw")){
            st+="\n";
            file.write(st.getBytes());
        }catch(IOException ex){
            ex.getMessage();
        }
    }
    // starts writing threads
    public static void startThread(int number){
        Thread thread = new Thread(){
            @Override
            public void run() {
                synchronized (this){
                    writeString(createString(number));
                }
            }
        };

        thread.start();
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }


    public static void main(final String[] args) {
        for(int i = 0; i < 9; i++){
            startThread(i);
        }
    }
}

Моя реализация перезаписывает только первую строку файла, но должен написать что-то вроде этого:

00000000000000000000

11111111111111111111 

22222222222222222222 

33333333333333333333 

44444444444444444444 

55555555555555555555 

66666666666666666666 

77777777777777777777 

88888888888888888888 

99999999999999999999

Как мне исправить мою «часть параллелизма» кода, чтобы е работает правильно? Заранее спасибо!

1 Ответ

0 голосов
/ 05 августа 2020

Когда вы пишете в файл, вам нужно переместить указатель в правильное положение. Вам нужно вызвать метод поиска в RandomAccessFile, а затем переместить указатель на количество байтов. Например, первый поток будет искать до 0, второй будет искать до 21 и т. Д. проблема с распараллеливанием.

Я не хотел давать готовое решение, но мне стало любопытно. Вот кое-что, чему вы можете научиться у

import java.io.IOException;
import java.io.RandomAccessFile;

public class Blah {
    // creates string before writing to the file
    public static String createString(int integer){
        StringBuilder result = new StringBuilder("");

        for(int i = 0; i < 20; i++){
            result.append(integer);
        }

        result.append("\n");
        return result.toString();
    }

    public static void main(final String[] args) throws IOException {
        RandomAccessFile file = new RandomAccessFile("part5.txt", "rw");
        Blah blah = new Blah();
        for(int i = 0; i <= 9; i++){
            Thread thread = new Thread(blah.new NumberWriter(i, file));
            thread.start();
        }

        file.close();
    }

    private class NumberWriter implements Runnable {
        int number;
        RandomAccessFile file;

        public NumberWriter(int number, RandomAccessFile file) {
            this.number = number;
            this.file = file;
        }


        public void run() {
            try {
                int seek = this.number * 20 + number;
                System.out.println("number is  : " + number + " : seeking to : " + seek);

                file.seek(seek);
                file.write((createString(this.number)).getBytes());
            } catch (IOException ioex) {
                ioex.printStackTrace();
            }
        }
    }
}
...