2015-09-05 163 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指针。

相关问题