在多个不同线程之间共享变量

我想在多个线程之间共享一个变量,如下所示:

boolean flag = true;
T1 main = new T1();
T2 help = new T2();
main.start();
help.start();

我想在主线程和帮助线程之间共享,这是我创建的两个不同的Java类。有什么办法可以做到这一点吗?谢谢!flag


答案 1

两者都可以引用包含此变量的类。
然后,您可以使此变量易失性,这意味着
对该变量的更改在两个线程中都立即可见。T1T2

有关详细信息,请参阅此文章

可变变量共享同步的可见性特征,但不共享原子性特征。这意味着线程将自动看到易失性变量的最新值。它们可用于提供线程安全性,但仅限于一组非常有限的情况:那些不在多个变量之间或变量的当前值与其未来值之间施加约束的情况。

并注意使用与更复杂的共享状态方法的利弊。volatile


答案 2

除了其他建议之外,您还可以将标志包装在控件类中,并在父类中创建它的最终实例:

public class Test {
  class Control {
    public volatile boolean flag = false;
  }
  final Control control = new Control();

  class T1 implements Runnable {
    @Override
    public void run() {
      while ( !control.flag ) {

      }
    }
  }

  class T2 implements Runnable {
    @Override
    public void run() {
      while ( !control.flag ) {

      }
    }
  }

  private void test() {
    T1 main = new T1();
    T2 help = new T2();

    new Thread(main).start();
    new Thread(help).start();
  }

  public static void main(String[] args) throws InterruptedException {
    try {
      Test test = new Test();
      test.test();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}