2013-01-04 34 views
0

我創建自己的線程中的每個兩個對象發送的對象尚未創建另一個對象的引用......

Conversation c = new Conversation(); 
    Thread t1 = new Thread(c); 
    t1.start(); 

    HunterCom ns = new HunterCom(c); 
    Thread t2 = new Thread(ns); 
    t2.start(); 

我需要發送的交談對象(C)一參考HunterCom對象(ns)

有沒有辦法做到這一點? Im的結構,因爲當我想將它發送給c時ns尚未創建。

+3

您的代碼示例與您的描述不符。這些對象不在新線程中創建。所有創建都發生在當前正在執行的線程中。對於爲什麼你不能只用'c.setHunderCom(ns)'的一些細節將有助於理解這個問題。 – Affe

+3

你有什麼理由不能等到'ns'創建之後纔開始't1'? – stevevls

回答

3

聽起來好像你希望c和ns是相互引用的 - 即c引用ns,ns引用c。

如果這是你問什麼,你將需要把在C二傳手,允許您設置HunterCom對象:

public class Conversation{ 
    void setHunterCom(HunterCom a)... 
} 

這就是說,如果你有參考週期的這個樣子,這通常表示需要審查的對象模型。如果你剝開洋蔥,你可能會找到一個重構,消除循環引用。這是值得的,因爲它可以讓你的代碼更容易在下一步工作。

0

一種選擇是創建一個可以容納上引用到兩個第三類:

class ComManager { 
    // getter and setter for Conversation 
    // getter and setter for HunterCom 
} 

然後實例化這個類,並把它作爲一個ARG到這兩個對象:

ComManager com = new ComManager(); 
Conversation c = new Conversation(com); 
HunterCom ns = new HunterCom(com); 

現在,這兩個對象都有一個對com的引用,它有ConversationHunterCom的getter方法,這些方法可以在每個線程運行時使用。

第二個選項是改變你如何實例化的東西的順序 - 創建ConversationHunterCom不帶任何參數,然後分配到相互之間的引用是這樣的:

Conversation c = new Conversation(); 
HunterCom ns = new HunterCom(); 
c.setHunterCom(ns); 
ns.setConversation(c); 

可能有其他幾個類似的選項以及;希望這會給你一個找到其他模式的出發點,讓你找到你想要的東西。