如何保持监听线程的活动状态

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构造函数启动线程。

我希望保持这个线程一直运行,直到我中断它。


你能发一下你的代码吗? - Rajj
我已经发布了这个线程,请告诉我各位通常怎么保持监听器运行? - Alind Billore
1
我认为,除非ChatManager由于某些原因删除了侦听器,否则侦听器应该永久保持注册状态。您不需要在后台线程中执行注册,并且没有理由保持该线程运行。正如Peter所指出的那样,您的侦听器代码将从不同的线程调用。 - Gray
我不知道你想做什么,但这个线程是无用的,正如其他人所说,你可以摆脱它并在其他地方寻找解决问题的方法。 - Flavio
好的Gray,所以监听器从其他地方调用。 @Flavio 试着理解,这段代码并不无用,它会在任何事件发生时得到通知...问题很简单,它必须保持活动状态以便监听该通知,但是这段代码也随着主方法终止。如果你们中的任何聪明人能帮我做到这一点,我将不胜感激。 我们如何实例化一个监听器,以便它可以持续监听事件?? - Alind Billore
显示剩余3条评论
3个回答

3

有几件事情比永久挂起初始线程更好:

使用otherThread.join()。这将导致您正在运行的当前线程休眠,直到其他线程执行完成。 如@nanda建议,使用ExcecutorService.shutdown()等待一组线程完成。 使用otherThread.setDaemon(false),然后让初始线程退出。这将将您的新线程设置为用户线程。只有守护线程在运行时,Java才会关闭。

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

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

来自如何在一行中使用Java挂起线程?的复制。


你是如何在问题发布后6秒钟内回答的? - Gray
@Gray 拷贝粘贴不需要很长时间! - meda
读取最后一行,花了6分钟才找到这个问题的正确答案,并提到我从哪里得到了这个答案。 - SSP
老板,你们得理解,我有一个非守护线程消失了!! - Alind Billore

1

一个线程会一直存活,直到run()方法返回或抛出错误/异常。如果你想让它保持存活状态,使用循环而不是返回并捕获任何错误/异常。


你好 Peter,它是一个监听器,当有人发送消息时会收到通知...那么我该如何使它保持运行状态?我已将它声明为非守护线程,但它跟随调用线程的终止而停止。你如何实现这样的功能呢? - Alind Billore
不清楚您是否控制线程。它是否为守护进程只在防止程序退出方面有所影响。如果您控制线程,则需要更改代码。如果线程是由库创建的,则需要了解库的工作原理。 - Peter Lawrey
顺便说一句,你启动的线程似乎没有任何作用。你可以将其删除,程序仍然能够正常运行。这个线程不是监听器会调用的。 - Peter Lawrey
谢谢回复,彼得。这段代码基本上是在消息到达时被通知...所以当有人寻找它时,它必须保持活动状态...那么如何保持其活动状态?有什么建议吗? - Alind Billore

0

这是我当时解决问题的方法, 所以这个案例不涉及多线程,只有一个需要永久运行的单个线程, 因此插入了

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

并从Spring Bean实例化它。 我还在考虑更高级的东西,用于这种单线程场景,比如awaitTermination();或类似的东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接