阻塞状态中的线程如何正常终止

2 篇文章 0 订阅

项目刚刚遇到一个这样的问题:

在一个死循环中获取和处理一个队列(一个LinkedList),当空闲时,线程会阻塞在从LinkedList获取列表的地方(在一个Get方法中,使用ReentrantLock锁,如果当前LinkedList的size为0,则使用Condition的await()方法,让当前线程阻塞),此时想让该线程终止时,我使用了Thread.join(),结果虚拟机dump抛出了一下错误:

"_S_0@1301" prio=5 tid=0x12 nid=NA waiting

  java.lang.Thread.State: WAITING

 at sun.misc.Unsafe.park(Unsafe.java:-1)

 at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)

 at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)

  ........

          ........

 at java.lang.Thread.run(Thread.java:722)

 

原因在于:

当线程处于waitting状态时,调用join终止是非法的,join是等待线程自然执行完毕,此时线程已经处在阻塞状态了,那么它不可能自然执行完毕,这种逻辑上也说不过去。

 

解决方法:

添加一个close方法,在这个方法中修改死循环终止的标识变量后,在调用notify()方法,让死循环继续执行,执行到标识变量后,判断状态并break推出循环。

例如:

public synchronized void Close()
{
	loopFlag = false;//	这个loopFlag是run方法内死循环的条件,例如:while(loopFlag){....}
	this.notify();
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值