2015-09-05 128 views
0

我在閱讀JMS書時遇到了一個問題。以下是代碼。 我的問題是與線程有關,所以我刪除了不必要的JMS代碼。爲什麼使用線程來調用類的構造函數?

public class MessageConsumer implements MessageListener{ 

public MessageConsumer(){ //Constructor 
    //configure JMS Connections 
} 

@Override 
public void onMessage(Message message) { 
    //receive message 
} 

public static void main(String[] args) { 
    new Thread(){ 
     @Override 
     public void run() { 
      new MessageConsumer(); 
     } 
    }.start(); 
    } 
} 

在上面的代碼中,爲什麼作者調用構造函數作爲新線程。 我嘗試如下調用構造函數,它給了相同的結果

public static void main(String[] args) { 
    new MessageConsumer(); 
} 

那麼,有沒有在上面的兩種方式有什麼區別。我知道創建一個新的Thread()將創建一個單獨的新線程。然而,在這個JMS的簡單例子中,我是否需要將構造函數作爲單獨的線程來調用?

+0

由於JMS用於與主程序異步通信,它們正在演示如何在單獨的線程中使用它。但從這個例子中我不清楚什麼會阻止你的主程序終止。 –

+0

對於這段代碼來說,創建一個新的線程是沒有意義的,除非你討厭主線程,並且想讓另一個線程不知道主線程。也許他會在用main方法創建jms東西后添加更多的東西。 – 2015-09-05 21:59:46

+0

@SkinnyJ我通過在調試模式下運行它來檢查代碼,即使主線程退出程序仍然繼續運行,看起來像MessageListner有一個單獨的線程。 – Angom

回答

0

這是一個稱爲「泄漏這個指針」的線程反模式,不應該使用。

授予,我假設(因爲你剝離了JMS代碼)構造函數設置連接到JMS以接收onMessage()回調中的消息。這將涉及將指針暴露給JMS,以便知道將傳入消息發佈到哪個回調。

底線是:MessageConsumer的實例()是而不是準備暴露在課外。

我懷疑作者的意圖是爲JMS產生一個新線程,以便主線程可以繼續做其他事情,否則程序不會做其他事情。但由於反模式,它不應該被使用。

這裏是另一種模式:

public class MessageConsumer implements MessageListener { 

    final JmsConnectionInfo connInfo; // or something. 
    public MessageConsumer(JmsConnectionInfo connInfo) { 
     this.connInfo = connInfo; 
    } 

    public void setupConnection() { 
     // Do JMS stuff here. In this method you can expose 
     // the 'this' pointer to JMS without problem. 
    } 

    @Override 
    public void onMessage (Message message) { 
     // Receive message here. 
    } 
} 

這樣,但你可以在任何你喜歡的線程創建一個MessageConsumer,但strarting JMS連接將涉及setupConnection()額外調用。

切勿從構造函數中暴露this指針。

相關問題