2014-09-03 74 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