2013-04-30 81 views
0

我有一個基於netty實現(com.corundumstudio.socketio)的Java socket.io服務器。如何停止Web服務器中的線程

服務器使用一些閉源代碼處理請求,有時候,請求可能會無限期地卡住。

當請求卡在同步的{}塊內時,會出現一個大問題,這樣他們就會持有一個資源,並且無法滿足其他任何請求。

我想添加一個選項來停止/終止一個特定的線程,以便它不會暫停整個應用程序。

使用Thread.stop()已被棄用,顯然也不會與網狀工作,如網狀捕捉ThreadDeath異常並將其轉換爲無害的警告信息...

添加中斷標誌位是不可能的,因爲困難的代碼被關閉。

什麼是實現服務器的好方法,使得它在這方面是強健的?

+0

I一般情況下,不要在同步部分內進行阻塞呼叫。 – 2013-04-30 08:46:29

回答

1

我相信不言而喻,你真正需要做的是找出並解決同步資源的問題,因爲殺掉線程最終不會真正完成工作。在不瞭解資源的情況下,就不可能就此提出具體建議。

在此期間,我建議你用有問題的代碼段包含ReentrantLock,每個線程都必須獲取這些代碼段才能到達同步塊。實際上,您正在用具有相同防護屬性的鎖代替同步的行爲(從中不能從中取出線程),但您可以超時獲取線程(因此線程不會堆積並停止你的系統),讓他們通過tryLock(long timeout, TimeUnit unit)獲得一個合適的超時鎖定。 ReentrantLock還有一層「instrumentation:允許你確定有多少線程正在等待鎖,並獲得對線程本身的直接引用。最後一點對你有用,因爲它允許你中斷等待的線程作爲* 的替代方法*停止 * ping它們,一旦等待的線程中斷,它將拋出一箇中斷的異常,然後以完全合法和不被棄用的方式繼續其途中。一些純粹主義者憤怒,並且謹慎的建議,可以讓其他線程通過使用sun.misc.Unsafe.tryMonitorEnter來避免進入同步塊,如果同步點已經被阻塞,將會返回false。

+0

感謝關於ReentrantLock的解釋。就我從文檔中瞭解到的情況來看,只有在等待鎖定的情況下,我才能中斷線程,但如果鎖定已經鎖定,則不能中斷線程。但我的主要問題是,線程有時會卡住,而他們持有鎖。當這種情況發生在Linux或Windows中時,我只需要終止卡住的進程,以便釋放它所擁有的任何鎖。 Java中的替代方法是什麼? – 2013-05-05 12:39:09