【问题标题】:How to access class(implements Runnable) field如何访问类(实现可运行)字段
【发布时间】:2018-11-03 19:19:24
【问题描述】:

我想通过输入值来控制线程。

如果输入值为 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.flag 是不可能的。对象 t 没有变量标志。

如何访问t.r.flag ....你能看懂吗?

我认为现在有些事情让很多傻瓜。

我是不是走错方向了?

【问题讨论】:

  • 根据经验,应从同步方法中访问公共变量(此处为 test.flag)。

标签: java multithreading runnable


【解决方案1】:

简答:

public boolean flag = true; 更改为public volatile boolean flag = true;

JVM 通过缓存 flag 的值来优化代码,因为很明显它会被更改。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-07
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多