Java如何中断Http请求线程



今天刚好有位同事问我,用Java请求Http的时候,有时候不希望阻塞太长时间,想做个监视然后可以中断请求的。

他的请求是放在独立线程中的,那么怎样中断一个请求?


我们先看看Thread的interrupt方法,能否做到这一点:

关于中的安全检查机制这里就不讨论了。我们只看interrupt能做什么。首先分几种情况:

1、线程被wait、join、sleep等方法阻塞时,interrupt将清除一个中断状态并接收到一个InterruptedException异常。

2、如果线程是被IO操作阻塞的,且这个IO是基于InterruptibleChannel的,那么这channel将被关闭,thread的中断状态将被设置,而且thread会收到一个java.nio.channels.ClosedByInterruptException异常。

3、如果这个线程是被阻塞在 java.nio.channels.Selector的,那么线程的中断状态将被设置并且将立刻从selection操作中返回,可能会返回非0值,就像wakeup方法被调用的那样。

如果不是上面三种情况之一的,那么线程的中断也会被设置。


那这样就很明显了。只要你的Http请求是使用InterruptibleChannel或者 java.nio.channels.Selector请求的,都可以通过interrupt来中断。


当然,最简单的做法是,使用你Http请求里面的超时设置(很多Http请求的API都有超时设置啦,你不相信去查查apache的HttpClient)!!没错,看了这篇文章,你会发现,只有这一行是有用的!


相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页