Следующий рабочий пример печатает каждые 3 секунды целое число от 1 до 20. Программа должна завершиться, если один из двух статусных флаков (t1.getStatus, t2.getStatus) является истинным. Если значение t1.getStatus
истинно, программа все еще работает, так как сканер не завершается.Прерывающий сканер зависит от другой темы
public class Test {
public static void main(String[] args) {
FirstTask t1 = new FirstTask();
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(t1, 0, 3, TimeUnit.SECONDS);
ParallelScanner t2 = new ParallelScanner();
Thread scan = new Thread(t2);
scan.start();
while(true){
if(t1.getStatus() || t2.getStatus()) break;
}
scan.interrupt();
executor.shutdown();
}
}
class ParallelScanner implements Runnable {
private volatile boolean status=false;
public void run() {
Scanner scan = new Scanner(System.in);
String input = scan.nextLine();
System.out.println("scanner stoped");
scan.close();
this.status=true;
}
public boolean getStatus(){
return this.status;
}
}
class FirstTask implements Runnable {
private volatile boolean status=false;
public void run() {
this.status = status();
}
private boolean status() {
int incident = (int) ((Math.random()*20)+1);
System.out.println(incident);
return incident < 7 ? true : false;
}
public boolean getStatus() {
return this.status;
}
}
Для управления прерыванием через статус flac может быть и неправильная царапина. Я также нашел аналогичный вопрос here. До сих пор первый ответ меня не схватил. И второй ответ неправильный. Может ли кто-нибудь дать небольшой рабочий пример по этому подходу? Есть ли другие альтернативы?
Thx для ключевого слова volatile. Я изменил код и надежды, что делает мой вопрос более понятным, потому что проблема остается прежней. Он печатает каждые 3 секунды число от 1 до 20. Это делается исполнителем. И сканер завернут в отдельный поток. Но если теперь 't1.getStatus' истинно, программа не завершается, хотя бесконечный цикл прерывается. Потому что сканер ждет ввода. –