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

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

发表于: 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

    震惊

    震惊

编辑推荐
如果进程中的任一线程调用了exit、_Exit或者_exit,那么整个进程就会终止。与此类似,如果信号的默
终止运行线程 1. 线程函数返回。 2. 线程通过调用ExitThread函数“杀死”自己(避免使用)。 3. 同
终止运行线程 1. 线程函数返回。 2. 线程通过调用ExitThread函数“杀死”自己(避免使用)。 3. 同
线程转储就是在jvm中所有活动的线程的一个列表,线程转储对于分析应用程序瓶颈和死锁情况非常有帮助
单一个项目由很多人开发,然后大家各自打各自的log。到最后logcat就根本没法看了。 adb自带的参数里
我想关于这个话题已经有很多前辈讨论过了。今天算是一次学习总结吧。 在android的设计思想中,为了
一、解决无法删除搜狗输入法sogouexe.exe文件 首先大家按在sogouexe文件上“右键”---“属性”---“
请求webservice中以下接口,会抛出异常 {"Message":"正在中止线程。","StackTrace":" 在 System.Runt
>> 接上文 "示例 - 如何在Console应用程序中应用SpiderStudio生成的DLL?", 将其改成多线程:
Imports System Imports System.Threading Module Module1 Sub Main() Dim mythread1 As Thread Dim
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号