如何在实现runnable的两个子类之间共享变量

时间:2016-01-11 10:52:18

标签: java multithreading

我有一个主类和两个子类,subClass1和subClass2实现了runnable ......

我已经同时运行了两个线程

致电

t1.start // t1 for subclass1

t2.start // t2 for subclass2

现在,我希望t1一直运行直到t2完成。

我可以在子类2的方法中添加一个布尔标志,以识别执行已完成; 现在我需要将该信息(布尔变量)传递给subclass1以停止从其中执行一组代码。 [使用while(true)loop;]

那么如何创建一个可以被两个子类访问的公共变量呢?

有人可以为我建议一个解决方案吗?

2 个答案:

答案 0 :(得分:3)

AtomicBoolean传递给子类。

public class SubClass1 implements Runnable {
    private AtomicBoolean b;
    public SubClass1(AtomicBoolean b) {
        this.b = b;
    }

    public void run() {
        while(b.get()) {  // Assuming SubClass2 sets it to false when it's no longer running
            // Do something
        }
    }
}

实施SubClass2留作OP的练习。

答案 1 :(得分:1)

如果可能,我建议避免在并发环境中共享可变状态,但假设您遇到无法避免的情况之一,您可以尝试类似的事情(根据自己的需要进行调整):

class SharedState {
  public final Object mutex = new Object();
  public boolean variable;
}

class Subclass extends MyClass1 implements Runnable {
  private SharedState sharedState;

  public Subclass1(SharedState sharedState) {
    this.sharedState = sharedState;
  }

  // ...

  @Override
  public void run() {
    // ...
    synchronized(sharedState.mutex) {
      // access sharedState.variable
    }
    // ...
  }
}

基本上在外面创建SharedState并在创建时注入子类(或者在其中一个中创建它,检索并注入另一个,无论如何)。然后使用该共享变量记住您对共享状态的棘手的所有了解。