`
aigo
  • 浏览: 2675865 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

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

 
阅读更多

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

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

 

 

分享到:
评论

相关推荐

    java线程状态转换图

    本文将详细介绍 Java 线程状态转换图,包括初始状态、可运行状态、运行状态、阻塞状态、锁池状态、等待队列状态和终止状态七种状态的定义、特点和转换关系。 初始状态(Newborn) * 线程的实现有两种方式,一是...

    终止线程的源代码资源

    2. **线程终止方式** - **正常结束**:run()方法执行完毕,线程自然结束。 - **中断**:调用线程的interrupt()方法,标记线程为已中断状态,线程在合适时机检查中断标志并响应,如抛出InterruptedException。 - *...

    C# 如何挂起线程、休眠线程和终止线程(源码例)

    本文将深入探讨如何挂起线程、休眠线程以及终止线程,这些都是多线程编程中的关键概念。 首先,让我们了解线程的基本概念。线程是程序执行的流程,每个进程至少有一个线程。在多线程环境中,多个线程可以共享同一...

    java中 如何终止一个线程

    这种方式适用于非阻塞状态下的线程,但对于处于阻塞状态中的线程,则需要采取其他措施。 **2. 处于阻塞状态的线程** 当线程进入阻塞状态(例如调用了`Thread.sleep()`、`Object.wait()`、`Selector.select()`等...

    Java线程状态流转图

    Java线程状态流转图是一种用于描述Java线程生命周期中不同的状态和状态转换的图形表示方式。该图形展示了Java线程从创建到终止的整个生命周期,并详细介绍了每种状态的特点和转换规则。 NEW(初始化状态) 在Java...

    Java线程:线程状态的转换

    5. **死亡状态(Terminated)**:当线程执行完`run()`方法或被异常终止后,线程就进入了死亡状态。此时线程对象仍然存在,但不能再被启动。 #### 二、线程状态的转换 线程状态之间的转换是多线程编程的核心概念之一...

    一个简单的多线程例子,启动线程与终止线程。

    此外,Thread类还提供了interrupt()方法来发送中断请求,但这并不一定会立即停止线程,而是在线程检查中断状态(如在sleep(), wait(), join()等阻塞方法中)时抛出InterruptedException。 除了基本的线程操作,了解...

    vc中获取一个线程的状态及返回值

    - 线程有多种状态,包括新建、可运行、运行、等待、暂停、终止等。 - 可以使用`GetThreadContext()`,`GetThreadTimes()`,或`QueryThreadCycleTime()`等API查询线程状态。 4. **线程同步**: - 为了确保线程...

    Java多线程(二)、线程的生命周期和状态控制

    - 在运行过程中,线程可能会因为执行了`Thread.sleep()`或等待输入/输出操作等原因而暂时失去CPU资源,此时线程会从运行状态变为阻塞状态。 4. **阻塞状态**: - 线程在运行过程中,由于某些原因(如执行了`...

    Java线程如何终止.pdf

    以下将详细解释三种主要的Java线程终止方法。 1. **使用退出标志终止线程** 当一个线程的`run`方法执行完毕时,线程会自动终止。然而,有些线程可能包含无限循环,例如服务器监听客户端请求的线程。在这种情况下,...

    唤醒阻塞休眠线程示例

    1. **线程状态**:线程在运行过程中有多种状态,包括新建(New)、可运行(Runnable)、运行(Running)、等待/阻塞(Blocked/Waiting)和终止(Terminated)。阻塞和休眠是线程在等待资源或特定事件时的状态。 2. ...

    线程终止问题

    以下是一个使用 `interrupt` 方法的例子,展示了在阻塞状态下终止线程: ```java public class ThreadInterrupt extends Thread { public void run() { try { Thread.sleep(50000); // 延迟 50 秒 } catch ...

    Android线程结束——合理的结束你想结束的线程

    2. **使用interrupt()方法**:如果线程在循环或阻塞操作中,可以调用interrupt()方法来标记线程应该停止执行。在循环或阻塞操作中,应定期检查isInterrupted()状态,以便在收到中断信号后优雅地退出。 3. **线程的...

    线程的挂起、唤醒和终止

    在Java中,可以使用`Thread.suspend()`方法来挂起线程,但需要注意,这个方法会使得线程陷入阻塞状态,直到被其他线程唤醒。然而,`Thread.suspend()`和相应的`Thread.resume()`方法已不推荐使用,因为它们可能导致...

    怎么干净的终止一个线程

    在多线程编程中,确保线程的正常、干净终止是一项关键任务,因为不恰当的终止可能导致资源泄漏、数据不一致和其他不可预期的行为。本文将详细介绍如何通过插入异常来实现线程的干净终止,并讨论防止线程阻塞的策略。...

    设计滚动字演示线程状态及改变方法

    - **线程状态**:线程有五种基本状态:新建、就绪、运行、阻塞和死亡。理解这些状态对于正确控制线程至关重要。 2. **滚动文字实现**: - **文本显示**:Java提供了`java.awt`和`javax.swing`包,用于创建图形...

    VC 线程 创建 操作 同步 终止 UI线程等各种线程例子

    在IT行业中,线程是操作系统的基本执行单元,它允许程序并行执行多个任务。在Windows编程中,Visual C++(VC)提供了丰富的API来创建、操作、同步和管理线程,尤其是在开发多线程应用程序时。下面将详细介绍标题和...

    在java中的线程的转换图

    线程在生命周期中会经历多种状态,包括新建(New)、可运行(Runnable)、运行(Running)、阻塞(Blocked)、等待(Waiting)、超时等待(Timed Waiting)和终止(Terminated)。下面我们将详细讨论这些状态以及...

    线程池使用介绍用程序可以有多个线程,这些线程在休眠状态中需要耗费大量时间来等待事件发生。其他线程可能进入睡眠状态,并且仅定期被唤醒以轮循更改或更新状态信息,然后再次进入休眠状态

    在应用程序中,多个线程可能会处于等待状态,等待某个事件的发生或者进行周期性的状态检查,这样的操作会消耗资源,因为线程即使在休眠也需要占用内存。线程池通过集中管理这些线程,减少了创建和销毁线程的开销,...

Global site tag (gtag.js) - Google Analytics