簡體   English   中英

如何讓聽眾線程活躍起來

[英]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()或永遠。

復制自如何在一行中掛起Java中的線程?

一個線程說明活着,直到run()返回(或拋出錯誤/異常)如果你想保持它活着,使用循環,不要返回並捕獲任何錯誤/異常。

這就是我解決問題的時間,所以這個案例不是多線程,只有一個線程需要永遠運行,所以插入

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

並從spring bean中實例化它。 我也在為這個單線程場景看待更多花哨的東西,比如awaitTermination(); 或類似的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM