2017-02-18 4 views
0

Следующий рабочий пример печатает каждые 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. До сих пор первый ответ меня не схватил. И второй ответ неправильный. Может ли кто-нибудь дать небольшой рабочий пример по этому подходу? Есть ли другие альтернативы?

ответ

0

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

Вам нужно внести свой статусный переменный volatile, чтобы он читал из ram каждой нитью, или вы получите своеобразное неопределенное поведение.

Почему у вас нет петли, использующей сканер? Я не знаю специфики вашего класса Scanner, есть ли исключение, когда больше нет данных или null возвращается, как предполагает мой код?

for(;;){ 
    String input = scan.nextLine(); 
    if(input == null) 
     break; 
    // Assuming that by jump over (run through) you mean: 
    // ignore the line that comes from the scanner 
    if(!t1.getStatus()){ 
     System.out.println(input); 
    } 
} 

также ваш метод GetStatus() необходимо сбросить статус true или он будет игнорировать (= не печатать) все последовательные строки.

+0

Thx для ключевого слова volatile. Я изменил код и надежды, что делает мой вопрос более понятным, потому что проблема остается прежней. Он печатает каждые 3 секунды число от 1 до 20. Это делается исполнителем. И сканер завернут в отдельный поток. Но если теперь 't1.getStatus' истинно, программа не завершается, хотя бесконечный цикл прерывается. Потому что сканер ждет ввода. –

Смежные вопросы