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

在一个死循环中获取和处理一个队列(一个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();
}

 

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐