Как получить доступ к классу (реализует Runnable) поле - PullRequest
0 голосов
/ 03 ноября 2018

Я хочу контролировать поток по входному значению.

если входное значение равно 1, чем-то заниматься.

больше ничего.

class Main {
  class test implements Runnable{
    public boolean flag = true;
    public int val = 0;

    @Override 
    public void run(){
      while(true){
        if(flag == true){
          pt();
        }
      }
    }

    public void pt(){
      System.out.println(val++);
      flag = false;
    }
  }

  public static void main(String[] args) {
    Main m = new Main();
    test r = m.new test();
    Thread t = new Thread(r);
    t.start();

    Scanner reader = new Scanner(System.in);
    while(true){
      int n = reader.nextInt();
      if(n==1){
        r.flag = true;
        // t.flag = true;
      }
      else{
        r.flag = false;
        // t.flag = false;
      }
   }
  }
}

Это мой код.

Очевидно, Я знал, что r.flag не меняет значение Thread t. Так что, даже если набрать 1, ничего не происходит. но т.флаг невозможен. объект t не имеет флаг переменной.

Как получить доступ к t.r.flag .... вы понимаете?

Я думаю, что сейчас что-то делает глупостей.

Я иду в неправильном направлении?

1 Ответ

0 голосов
/ 03 ноября 2018

Краткий ответ:

Изменить public boolean flag = true; на public volatile boolean flag = true;

JVM оптимизировала код, кэшируя значение флага, потому что «очевидно», что оно будет изменено.

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