【问题标题】:How to Keep Listener Thread Alive如何保持监听线程活着
【发布时间】:2016-03-04 18:58:47
【问题描述】:

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

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

【问题讨论】:

  • 你能发布你的代码吗?
  • 我已经发布了这个帖子,先生,请告诉我你们通常会做什么来保持听众的运行?
  • 我认为监听器应该永远保持注册状态,除非ChatManager 出于某种原因删除了监听器。您不需要在后台线程中进行注册,也没有理由让该线程继续运行。正如彼得指出的那样,您的侦听器代码将从不同的线程中调用。
  • 我不知道你想做什么,但是这里的线程是没有用的,因为其他人说你可以摆脱它并在别处寻找你的问题。

标签: java multithreading


【解决方案1】:

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

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

【讨论】:

  • 问题发布后 6 ,您是如何回答这个问题的?
  • @Gray 复制粘贴没多久!
  • 阅读最后一行,花了 6 分钟才找到这个问题的正确答案,并提到我从哪里得到这个答案
  • 老大你们要明白,我有一个非守护线程消失了!!
【解决方案2】:

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

【讨论】:

  • 你好彼得,它是一个监听器,当有人发送消息时它会收到通知......那么我如何让它保持运行?我已将其声明为非守护线程,但以调用者线程终止而终止。你如何实现这样的事情?
  • 不清楚是否控制线程。它是否是一个守护进程仅在阻止程序退出方面很重要。如果您控制线程,则需要更改代码。如果线程是由库创建的,则需要了解库的工作原理。
  • 顺便说一句,您启动的线程似乎没有做任何事情。你可以删除它,它会做同样的事情。它不是监听器可以调用的线程。
  • 感谢peter的回复,这个代码基本上会在消息到达时得到通知......所以当有人寻找它时它必须活着......那么如何让它保持活力有什么建议?
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-08-18
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多