2016-01-11 98 views
1

我有一个实现Runnable一个主类和两个子类,subClass1和subClass2两个子类之间的变量...如何共享实现Runnable

我已经通过调用同时

运行两个线程

t1.start // T1为subclass1

t2.start // T2为subclass2

现在,我想T1运行,直到日e t2完成。

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

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

任何人都可以请建议我一个解决方案吗?

+1

显示一些代码来解释发生了什么。 SubClass1和SubClass2是Main类的内部类吗?您始终可以将[AtomicBoolean]的相同引用(https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicBoolean.html)传递给两个子类。 – WalterM

+1

这个问题有点引起你的措辞。你不想在类之间共享一个变量,但是你想在两个实例之间共享一个对象。解决方案非常简单:构建共享对象。将共享对象传递给可运行实现的构造函数。 – SpaceTrucker

回答

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

+0

这是一个很好的解决方案.. :)非常感谢... –

+0

通常有一个简单的问题解决方案。 – Kayaman

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外部并注入到您的创建子类(或创建它在其中之一,检索并注入到另一个,无论)。然后使用那个共享变量记住你所了解的关于共享状态的技巧。

+0

感谢您的回复.. :) –