2016-01-11 139 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

感謝您的回覆.. :) –