随机存取文件上的并发性

时间:2019-01-20 18:51:59

标签: java concurrency core randomaccessfile

创建k个线程,同时打入一个文件符号。在0行的文件中第一个线程写入数字0 .........在9行的文件中十个线程写入数字9。

实施要求。

  1. 必须以1毫秒的暂停记录每个数字!
  2. 编写时,请使用RandomAccessFile类。
  3. 最多只能使用RandomAccessFile类的一个对象!
  4. 开始之前,必须将要进行记录的文件删除(如果存在)。
  5. 运行子线程执行后,主线程必须等待它们完成,然后将文件内容输出到控制台。

备注。

  1. RandomAccessFile#seek(长整数)方法使您可以在文件内移动指针。每个流都必须知道在文件中的哪个位置写入信息。由于条件中出现了“字符串”一词,因此每个流的输出都应使用行终止符终止,该行终止符应以跨平台的方式输出。
  2. 要写入某个数字,可以使用表达式'0'+ n,其中n是0到9之间的一个数字。 在文件内移动指针和记录信息必须同步。

我认为解决了我的问题,这是RandomAccessFile中的seek方法,但是我不知道他的用法。

public final class Part5 {
    private static final List<Thread> threadList = new ArrayList<>();
    private static AtomicInteger pos = new AtomicInteger(0);
    private static final String FILE_NAME = "part5.txt";

    private Part5() {
    }

    public static void main(String[] args) throws InterruptedException {
        run();
    }

    public static void run() throws InterruptedException {
        try {
            final RandomAccessFile accessFile = new RandomAccessFile(FILE_NAME, "rw");
            for (int i = 0; i < 10; i++) {
                Thread thread = new Thread(new RandomThread(accessFile, new AtomicInteger(i), pos));
                threadList.add(thread);
                thread.start();
                pos.getAndAdd(20);
            }

            for (Thread thread : threadList) {
                thread.join();
            }
        } catch (FileNotFoundException e) {
            System.err.println(e.getMessage());
        }
    }
}

class RandomThread implements Runnable {
    private final RandomAccessFile accessFile;
    private AtomicInteger number;
    private AtomicInteger pos;

    public RandomThread(RandomAccessFile accessFile, AtomicInteger number, AtomicInteger pos) {
        this.accessFile = accessFile;
        this.number = number;
        this.pos = pos;
    }

    @Override
    public synchronized void run() {
        synchronized (accessFile) {
            try {
                for (int i = 0; i < 20; i++) {
//                    accessFile.seek(pos.getAndIncrement());
                    accessFile.writeBytes(number.toString());
                    Thread.sleep(1);
                }
                accessFile.write(System.lineSeparator().getBytes());
                Thread.currentThread().interrupt();
            } catch (IOException | InterruptedException e) {
                System.err.println(e.getMessage());
            }
        }
    }
}

public final class Part5 {
    private static final List<Thread> threadList = new ArrayList<>();
    private static AtomicInteger pos = new AtomicInteger(0);
    private static final String FILE_NAME = "part5.txt";

    private Part5() {
    }

    public static void main(String[] args) throws InterruptedException {
        run();
    }

    public static void run() throws InterruptedException {
        try {
            final RandomAccessFile accessFile = new RandomAccessFile(FILE_NAME, "rw");
            for (int i = 0; i < 10; i++) {
                Thread thread = new Thread(new RandomThread(accessFile, new AtomicInteger(i), pos));
                threadList.add(thread);
                thread.start();
                pos.getAndAdd(20);
            }

            for (Thread thread : threadList) {
                thread.join();
            }
        } catch (FileNotFoundException e) {
            System.err.println(e.getMessage());
        }
    }
}

class RandomThread implements Runnable {
    private final RandomAccessFile accessFile;
    private AtomicInteger number;
    private AtomicInteger pos;

    public RandomThread(RandomAccessFile accessFile, AtomicInteger number, AtomicInteger pos) {
        this.accessFile = accessFile;
        this.number = number;
        this.pos = pos;
    }

    @Override
    public synchronized void run() {
        synchronized (accessFile) {
            try {
                for (int i = 0; i < 20; i++) {
//                    accessFile.seek(pos.getAndIncrement());
                    accessFile.writeBytes(number.toString());
                    Thread.sleep(1);
                }
                accessFile.write(System.lineSeparator().getBytes());
                Thread.currentThread().interrupt();
            } catch (IOException | InterruptedException e) {
                System.err.println(e.getMessage());
            }
        }
    }
}

文件输出

00000000000000000000
99999999999999999999
88888888888888888888
77777777777777777777
66666666666666666666
55555555555555555555
44444444444444444444
33333333333333333333
22222222222222222222
11111111111111111111

但是我等着

00000000000000000000
11111111111111111111
22222222222222222222
33333333333333333333
44444444444444444444
55555555555555555555
66666666666666666666
77777777777777777777
88888888888888888888
99999999999999999999

0 个答案:

没有答案