ike*_*8me 6 java multithreading runnable
我正在开发一个多线程应用程序来连接外部服务器 - 每个都在不同的线程上 - 并且会被阻塞直到有输入.其中每个都扩展了Thread类.为了便于解释,我们称之为"连接线程".
所有这些连接线程都存储在并发hashmap中.
然后,我允许RESTful Web服务方法调用取消任何线程.(我正在使用Grizzly/Jersey,所以每次调用都是一个线程.)
我检索特定的连接线程(来自hashmap)并在其上调用interrupt()方法.
那么,这是一个问题,在连接线程中,我如何捕获InterruptedException?(当外部RESTful命令停止连接线程时,我想做点什么.)
那么,这是一个问题,在连接线程中,我如何捕获InterruptedException?
你不能.因为如果您的线程在读取I/O操作中被阻止,则不能interrupted.这是因为interrupt只是设置一个标志来指示线程已被中断.但是如果您的线程已被I/O阻塞,它将看不到该标志.
正确的方法是关闭底层套接字(线程被阻塞),然后捕获异常并将其传播.
因此,由于您的连接线程extend Thread执行以下操作:
@Override
public void interrupt(){
try{
socket.close();
}
finally{
super.interrupt();
}
}
Run Code Online (Sandbox Code Playgroud)
这样就可以中断I/O上阻塞的线程.
然后在你的run方法中做:
@Override
public void run(){
while(!Thread.currentThread().isInterrupted()){
//Do your work
}
}
Run Code Online (Sandbox Code Playgroud)
所以你的情况不要尝试catch了InterruptedException.您无法中断I/O上阻塞的线程.只需检查您的线程是否已被中断,并通过关闭流来促进中断.
| 归档时间: |
|
| 查看次数: |
7837 次 |
| 最近记录: |