我正在开发一个多线程应用程序来建立与外部服务器的连接 - 每个服务器都在单独的线程上 - 并且将被阻止,直到有输入。其中每一个都扩展了 Thread 类。为了便于解释,我们将这些称为“连接线程”。
所有这些连接线程都存储在并发哈希图中。
然后,我允许 RESTful Web 服务方法调用来取消任何线程。 (我使用的是 Grizzly/Jersey,因此每个调用都是一个独立的线程。)
我检索特定的连接线程(从哈希映射)并对其调用 Interrupt() 方法。
那么,问题来了,在连接线程中,如何捕获 InterruptedException? (当连接线程被外部 RESTful 命令停止时,我想执行一些操作。)
所以,这是一个问题,在连接线程中,我如何捕获
中断异常?
你不能。因为如果您的线程在读 I/O 操作上被阻塞,则它不能interrupted
。这是因为interrupt
只是设置一个标志来指示线程已被中断。但如果您的线程因 I/O 而被阻塞,它将看不到该标志。
正确的方法是关闭底层套接字(线程被阻止),然后捕获异常并将其向上传播。
所以既然你的连接线程extend Thread
请执行下列操作:
@Override
public void interrupt(){
try{
socket.close();
}
finally{
super.interrupt();
}
}
这样就可以中断 I/O 上阻塞的线程。
然后在你的run
方法做:
@Override
public void run(){
while(!Thread.currentThread().isInterrupted()){
//Do your work
}
}
所以在你的情况下不要尝试catch
an InterruptedException
。您无法中断 I/O 上阻塞的线程。只需检查您的线程是否已被中断,并通过关闭流来促进中断。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)