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