2014-09-03 60 views
0

我有一個SwingWorker,打開ServerSocket,然後在服務器套接字上調用.accept()。大多數情況下,該線程在撥打accept()時被阻止。在某個時候,我想取消線程。問題在於工作線程被accept()調用阻塞。有沒有一種機制可以「解除」這個調用並調用一些關機代碼?取消由Socket.Accept()阻止的SwingWorker?

目前我打電話mySwingWorker.cancel(true),並聽我的PropertychangeListener財產變化。當它被觸發時,我檢查DONE狀態,然後在嘗試呼叫mySwingworker.get()時檢查CancellationException

奇怪的部分是,即使在CancellationException被捕獲後,我仍然可以連接到工作人員打開的套接字。

回答

4

關閉ServerSocket。這將解除accept()的異常。

如果您想要一個更清潔的解決方案,請設置布爾值,將Socket連接到偵聽端口,並讓accept()循環在每次接受連接時檢查布爾值。或者,設置一個accept()超時值,設置一個布爾值,讓你的accept()循環在每次超時時檢查布爾值。

+0

超時方法適用於我所需要的,非常感謝! – KDecker 2014-09-03 21:49:58