当前位置:首页 > 开发 > 编程语言 > 多线程 > 正文

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

发表于: 2013-06-21   作者:aigo   来源:转载   浏览:
摘要: 项目刚刚遇到一个这样的问题: 在一个死循环中获取和处理一个队列(一个LinkedList),当空闲时,线程会阻塞在从LinkedList获取列表的地方(在一个Get方法中,使用ReentrantLock锁,如果当前LinkedList的size为0,则使用Condition的await()方法,让当前线程阻塞),此时想让该线程终止时,我使用了Thread.join(),结果虚拟机dump抛出了一

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

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

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号