我有一个类,它是传入消息的侦听器,并且应该永远存活(以便它可以侦听传入的消息),直到我明确断开它的连接。我已将该线程声明为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构造函数启动线程。
我想保持这个线程的运行,直到我打断它。
答案 0 :(得分:2)
你可以做的一些事情比永远挂起初始线程更好:
使用otherThread.join()
。这将导致您正在运行的当前线程休眠,直到另一个线程执行完毕。
正如@nanda建议的那样,使用ExcecutorService.shutdown()
等待线程池完成。
使用otherThread.setDaemon(false)
并让您的初始线程退出。这会将您的新线程设置为用户线程。在运行的唯一线程是守护程序线程之前,Java不会关闭。
synchronized(this) {
while (true) {
this.wait();
}
}
这将使当前线程在当前类的监视器上等待,直到有人调用notify()
或永远。
答案 1 :(得分:1)
一个线程说明活着直到run()
返回(或抛出错误/异常)如果你想让它保持活动状态,请使用循环,不要返回并捕获任何错误/异常。
答案 2 :(得分:0)
这就是我解决问题的时候, 所以这个案例不是多线程的,只有一个线程需要永远运行, 所以插入
public final void run() {
while(true)
{
//Run Method Logic...
}
}
从spring bean中实例化它。 我也在为这个单线程场景看待更多花哨的东西,比如awaitTermination();或类似的东西。