如何让听众线程活跃起来

时间:2013-10-22 15:58:48

标签: java multithreading

我有一个类,它是传入消息的侦听器,并且应该永远存活(以便它可以侦听传入的消息),直到我明确断开它的连接。我已将该线程声明为setDaemon(false),但它终止于调用方法终止。

请告诉我如何使该线程保持活跃状态​​,并请详细说明如何实现Spring TaskExecutor以实现相同目的。

提前致谢。 它是一个监听器,当有人发送消息时它会得到通知......所以我该如何让它继续运行?

听众类

public class MyListnerImpl implements Listener {
    private final connectionImpl con;   

    public MyListnerImpl(ConnectionImpl con) {
    if (con.isAuthenticated() && con.isConnected()) {
        if (logger.isInfoEnabled()) {
            logger.info("Initializing XmppListner:");
        }
        this.itsCon = con;
        Thread t1 = new Thread(this);
        t1.setDaemon(false);
        t1.start();
    }
    }

    public final void listnerInterfaceMethod(final Chat chat, final Message message) {
        System.out.println("Message" + message);
    }

    public final void run() {
    itsCon.getChatManager().addChatListener(new ChatManagerListener() {
        public void chatCreated(final Chat chat, final boolean createdLocally) {
            if (!createdLocally) {
                chat.addMessageListener(itsFbml);
            }
        }
    });
    }
}

调用类只是创建它的对象,并且由Listeners构造函数启动线程。

我想保持这个线程的运行,直到我打断它。

3 个答案:

答案 0 :(得分:2)

你可以做的一些事情比永远挂起初始线程更好:

使用otherThread.join()。这将导致您正在运行的当前线程休眠,直到另一个线程执行完毕。 正如@nanda建议的那样,使用ExcecutorService.shutdown()等待线程池完成。 使用otherThread.setDaemon(false)并让您的初始线程退出。这会将您的新线程设置为用户线程。在运行的唯一线程是守护程序线程之前,Java不会关闭。

synchronized(this) {
    while (true) {
        this.wait();
    }
}

这将使当前线程在当前类的监视器上等待,直到有人调用notify()或永远。

How do you hang a thread in Java in one line?

复制

答案 1 :(得分:1)

一个线程说明活着直到run()返回(或抛出错误/异常)如果你想让它保持活动状态,请使用循环,不要返回并捕获任何错误/异常。

答案 2 :(得分:0)

这就是我解决问题的时候, 所以这个案例不是多线程的,只有一个线程需要永远运行, 所以插入

public final void run() {
while(true)
{
//Run Method Logic...
}
}

从spring bean中实例化它。 我也在为这个单线程场景看待更多花哨的东西,比如awaitTermination();或类似的东西。