[英]How to Keep Listener Thread Alive
我有一個類,它是傳入消息的監聽器,應該永遠存活(以便它可以監聽傳入的消息),直到我明確斷開它的連接。 我已將該線程聲明為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構造函數啟動線程。
我想保持這個線程創建運行,直到我打斷它。
你可以做的一些事情比永久掛起初始線程更好:
使用otherThread.join()
。 這將導致您正在運行的當前線程休眠,直到另一個線程執行完畢。 正如@nanda建議的那樣,使用ExcecutorService.shutdown()
等待線程池完成。 使用otherThread.setDaemon(false)
並讓你的初始線程退出。 這會將您的新線程設置為用戶線程。 在運行的唯一線程是守護程序線程之前,Java不會關閉。
synchronized(this) {
while (true) {
this.wait();
}
}
這將使當前線程在當前類的監視器上等待,直到有人調用notify()
或永遠。
一個線程說明活着,直到run()
返回(或拋出錯誤/異常)如果你想保持它活着,使用循環,不要返回並捕獲任何錯誤/異常。
這就是我解決問題的時間,所以這個案例不是多線程,只有一個線程需要永遠運行,所以插入
public final void run() {
while(true)
{
//Run Method Logic...
}
}
並從spring bean中實例化它。 我也在為這個單線程場景看待更多花哨的東西,比如awaitTermination(); 或類似的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.