论坛首页 Java企业应用论坛

java线程阻塞中断和LockSupport的常见问题

浏览 13113 次
该帖已经被评为精华帖
作者 正文
   发表时间:2011-06-26  
现在iteye高质量的文章大部分来自杭州了。。。
0 请登录后投票
   发表时间:2011-06-27  
melin 写道
现在iteye高质量的文章大部分来自杭州了。。。


杭州是个好地方哈,还有整个阿里系都在杭州,可以考虑下    
0 请登录后投票
   发表时间:2011-10-11  
java并发编程实践也有类似的实现。
0 请登录后投票
   发表时间:2011-10-11  
不过没有那么深入。。。。。。。。。。。。。。。。
0 请登录后投票
   发表时间:2011-10-11  
agapple 写道
碧海山城 写道

说说俺的看到,Thread.isInterrupt()这种主动轮询的方法主要是在没有阻塞的时候处理的,它可以充当一个标志位的作用但是,在有阻塞的时候,比如sleep/wait他们会响应中断,抛出异常,类似socket、内部锁这种是不响应中断的,所以就死在那里了,类似你说的HTTPCLIENT超时的问题,

Thread.isInterrupted 本身设计上来讲,就不能处理这种情况;

InterruptAble 真是一种好方法,学习了,不过貌似如果是通过Thread这种方式起线程的话,也可以
覆盖Interrupted方法就好了,假设有个不响应中断的Socket阻塞:

 

public void interrupt(){
		try{
			println "interruptSelf"
			socket.close();
		}catch(IOException e){
		
		}finally{
			super.interrupt()
		}
	}
 

如果用FutureTask和Cancellable的话,也可以考虑覆盖FutureTask的cancel方法

 

 

 

FutureTask已经实现了cancel方法,也是发起了一个interrupt事件给运行的Thread,至于是否可以正常的响应中断,还是得看写任务代码的是否有处理中断异常。

 

你的这种处理方式也是一种思路,原理主要还是获取中断事件进行请求处理。

不过一般不建议这么做,如果是你设计一个多线程处理的tool工具,你不能假定使用者是否会正确/响应的线程中断,是把?

 

假设多线程处理工具的使用者不会处理中断和假设jdbc工具使用者不会sql一样无聊...

 

这里的技术很深,不过却不规范,如果外部建立了线程,这里把中断吃了,外部还要用怎么办?返回值这种事情,只能是自己的代码才能利用到,用其他人的类库的话,其他人怎么可能知道?

 

如果100%确定InterruptSupport要独占这个线程,那倒不如也把线程封装到InterruptSupport里面,这样外部就清爽多了.

 

0 请登录后投票
   发表时间:2011-10-11  
我晕,本来以为是用sun包里的native代码之类的东西进行立即中断

跑了一下代码,发现实际上还是利用了,关闭顶级资源让下级操作立即失败的方法进行的中断
0 请登录后投票
   发表时间:2011-10-11  
gtssgtss 写道
我晕,本来以为是用sun包里的native代码之类的东西进行立即中断

跑了一下代码,发现实际上还是利用了,关闭顶级资源让下级操作立即失败的方法进行的中断


java底层是支持强制中断的,只是不建议你用而已。
http://download.oracle.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html

Interruptible事件钩子,只能是允许你定义callback方法进行interrput监听,比如设置关闭变量等,或者关闭其依赖的资源。
0 请登录后投票
   发表时间:2011-10-11  
你现在的InterruptSupport是不会抛出InterruptedException的...你代码复制的时候是不是遗漏了什么
0 请登录后投票
   发表时间:2011-10-28  
学习学习,interrupt的确关注不多
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics