加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java:当被另一个线程中断时,如何在线程上捕获InterruptedExcept

发布时间:2020-12-15 02:48:12 所属栏目:Java 来源:网络整理
导读:我正在开发一个多线程应用程序来连接外部服务器 – 每个都在不同的线程上 – 并且会被阻塞直到有输入.其中每个都扩展了Thread类.为了便于解释,我们称之为“连接线程”. 所有这些连接线程都存储在并发hashmap中. 然后,我允许RESTful Web服务方法调用取消任何
我正在开发一个多线程应用程序来连接外部服务器 – 每个都在不同的线程上 – 并且会被阻塞直到有输入.其中每个都扩展了Thread类.为了便于解释,我们称之为“连接线程”.

所有这些连接线程都存储在并发hashmap中.

然后,我允许RESTful Web服务方法调用取消任何线程. (我正在使用Grizzly / Jersey,所以每次调用都是一个线程.)

我检索特定的连接线程(来自hashmap)并在其上调用interrupt()方法.

那么,这是一个问题,在连接线程中,我如何捕获InterruptedException? (当外部RESTful命令停止连接线程时,我想做点什么.)

解决方法

So,here is the question,within the connection thread,how do I catch
the InterruptedException?

你不能.由于如果您的线程在读取I / O操作中被阻止,则无法中断.这是因为中断只是设置一个标志来指示线程已被中断.但是如果您的线程已被I / O阻塞,它将看不到该标志.
正确的方法是关闭底层套接字(线程被阻塞),然后捕获异常并将其传播.
因此,由于您的连接线程扩展了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

    }  
}

所以在你的情况下不要试图捕获InterruptedException.您无法中断I / O上阻塞的线程.只需检查您的线程是否已被中断,并通过关闭流来促进中断.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读