10

我有一个类,它是传入消息的侦听器,并且应该永远活着(以便它可以侦听传入消息),直到我明确断开它的连接。我已将线程声明为 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 构造函数启动。

我想保持这个线程创建运行,直到我中断它。

4

3 回答 3

3

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

使用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 a line?

于 2013-10-22T16:05:22.997 回答
1

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

于 2013-10-22T16:07:27.523 回答
0

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

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

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

于 2015-08-11T09:33:31.657 回答