new Thread (runnable) .start () не работает должным образом, но run () работает - PullRequest
0 голосов
/ 05 мая 2020

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

Это мой основной класс:

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.function.Predicate;

public class Main {
    public static void main(String[] args) {
        File file = new File("C:\\Users\\Internet\\Desktop\\test123.txt");

        try (OutputStream out = new FileOutputStream(file); PrintStream print = new PrintStream(out)) {
            if (!file.exists())
                file.createNewFile();
            Predicate<Integer> pred = new CountPredicate(5);
            Runnable runnable = new RandomWriteRunner(pred, print);
            new Thread(runnable).start();
            //PrintStream p = r.getPrintStream();
            //runnable.run();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Это мой класс CountPredicate, который реализует Predicate и использует test (), чтобы определить, достигнуты ли критерии остановки.

import java.util.function.Predicate;

public class CountPredicate implements Predicate<Integer> {
    private int max;

    public CountPredicate(int max) {
        this.max = max;
    }

    @Override
    public boolean test(Integer current) {
        return current >= max;
    }
}

И это мой класс RandomWriteRunner, который реализует Runnable и использует конструктор, чтобы дать методу run () его значения для работы.

import java.io.PrintStream;
import java.util.Random;
import java.util.function.Predicate;

public class RandomWriteRunner implements Runnable {
    private Random random;
    private Predicate<Integer> stopCriterion;
    private int generatedSoFar;
    private PrintStream printStream;

    public RandomWriteRunner(Predicate<Integer> stopCriterion, PrintStream printStream) {
        random = new Random();
        this.stopCriterion = stopCriterion;
        generatedSoFar = 0;
        this.printStream = printStream;
    }

    @Override
    public void run() {
        while (!stopCriterion.test(generatedSoFar)) {
            printStream.println(random.nextDouble());
            generatedSoFar++;
            System.out.println(generatedSoFar);
        }
    }

    public PrintStream getPrintStream() {
        return this.printStream;
    }
}

Поскольку я не могу получить доступ к переменной printStream, поскольку она является частной, я использую Getter, чтобы поиграть с ней в моем классе Main.

Я пытался написать это:

RandomWriteRunner r = new RandomWriteRunner(pred, print);
Runnable runnable = r;
new Thread(runnable).start();
PrintStream p = r.getPrintStream();
p.print('a');

Обычно я открывал свой текстовый файл, и он был бы пуст, но на этот раз он сказал «а» и случайное двойное число. Почему это так? И эти 6 случайных двойных значений все еще в моем PrintStream? Когда я использую new Thread(runnable).run();, он работает, но я слышал об этом, потому что метод run () вызывается из моего текущего потока, а это не то, что я хочу. Кроме того, когда я использую код как есть и добавляю runnable.run(), записанный как комментарий в моем основном классе, моя консоль показывает значения от 1 до 6 вместо 1 до 5. Причина, по которой меня так смущает, заключается в том, что метод запуска очевидно, вызывается, так как моя консоль показывает мне System.out.println(generatedSoFar);, но не печатает случайные двойные числа в файл. Я упустил что-то очевидное? Спасибо за все ответы.

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