使用多个线程将数据写入文本文件(同时,在文件的不同行中)

Write data into text file with multiple threads (simultaneously, in different lines of file)

创建 k 个同时将字符写入同一文件的线程:

...

实施要求。

  1. 要求设置每写一位1毫秒的停顿

  2. 使用 RandomAccessFile 将数据写入文件。

  3. 您最多只能使用一个 RandomAccessFile 对象 class!

我写了这样的东西:

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

如何修复代码的“并发部分”以使其正常工作? 提前致谢!

写入文件时,需要将指针移动到正确的位置。您需要在 RandomAccessFile 中调用“seek”方法,然后将指针移动字节数。例如,第一个线程将查找 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();
            }
        }
    }
}