Я пытаюсь узнать больше о потоках и о том, как они работают. Я хотел бы использовать 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);
, но не печатает случайные двойные числа в файл. Я упустил что-то очевидное? Спасибо за все ответы.