24

java中的停放线程和等待线程有什么区别?我有一个 jboss 核心转储,分析它显示了很多停放的线程。

4

5 回答 5

22

Javadocpark()方法:

除非许可可用,否则禁用当前线程以进行线程调度。如果许可可用,则使用它并立即返回调用;否则,当前线程将出于线程调度目的而被禁用并处于休眠状态,直到发生以下三种情况之一:

其他一些线程以当前线程为目标调用 unpark;或者其他一些线程中断当前线程;或 虚假(即无缘无故)的调用返回。此方法不报告哪些导致该方法返回。调用者应该重新检查导致线程首先停止的条件。例如,调用者还可以确定线程在返回时的中断状态。

因此,停放的线程是使用LockSupport.park().

于 2012-04-04T10:34:03.613 回答
6

park() 和 wait() 都会导致线程被禁用。使禁用的线程再次处于活动状态取决于它是如何被禁用的。

通过调用禁用的线程LockSupport.park()将保持禁用状态,直到:

  • 其他一些线程调用unpark(),或
  • 其他一些线程调用interrupt(),或
  • “电话虚假(即无缘无故)返回”

通过调用 Object 的wait()禁用的线程(相当于调用wait(0))将保持禁用状态,直到:

于 2020-01-28T23:05:13.543 回答
3

在 Java 中,通过调用方法而停住的线程是等待线程(在 中)。LockSupport.park()Thread.state.WAITING

请参阅Thread.state.WAITING的 Java 文档。

有 3 种方法可以使线程处于 WAITING 状态:

  1. Object.wait 没有超时
  2. 没有超时的 Thread.join
  3. LockSupport.park

处于等待状态的线程正在等待另一个线程执行特定操作。

例如,一个对对象调用 Object.wait() 的线程正在等待另一个线程对该对象调用 Object.notify() 或 Object.notifyAll()。已调用 Thread.join() 的线程正在等待指定线程终止。

于 2019-05-14T02:19:33.733 回答
0

停车意味着在获得许可之前暂停执行。许可是指继续执行的许可。线程可以暂停其执行,直到允许可用。当 permit 可用时,停放的线程使用它并退出park() 方法

于 2019-12-02T15:23:07.767 回答
-2

LockSupport - 类采用设施基本线程阻塞原语来创建锁和其他同步类。

除非许可可用,否则方法 park() 将禁用当前线程以进行线程调度。

unpark(Thread thread) 使给定线程的许可可用(如果它尚不可用)。

像这样使用它:
finally { LockSupport.unpark(thread); }

于 2015-04-01T12:20:14.640 回答