java中的停放线程和等待线程有什么区别?我有一个 jboss 核心转储,分析它显示了很多停放的线程。
5 回答
看Javadoc的park()
方法:
除非许可可用,否则禁用当前线程以进行线程调度。如果许可可用,则使用它并立即返回调用;否则,当前线程将出于线程调度目的而被禁用并处于休眠状态,直到发生以下三种情况之一:
其他一些线程以当前线程为目标调用 unpark;或者其他一些线程中断当前线程;或 虚假(即无缘无故)的调用返回。此方法不报告哪些导致该方法返回。调用者应该重新检查导致线程首先停止的条件。例如,调用者还可以确定线程在返回时的中断状态。
因此,停放的线程是使用LockSupport.park()
.
park() 和 wait() 都会导致线程被禁用。使禁用的线程再次处于活动状态取决于它是如何被禁用的。
通过调用禁用的线程LockSupport.park()
将保持禁用状态,直到:
- 其他一些线程调用
unpark()
,或 - 其他一些线程调用
interrupt()
,或 - “电话虚假(即无缘无故)返回”
通过调用 Object 的wait()禁用的线程(相当于调用wait(0)
)将保持禁用状态,直到:
- 其他一些线程调用
notify()
或notifyAll()
,或 interrupt()
禁用线程上的一些其他线程调用
在 Java 中,通过调用方法而停住的线程是等待线程(在 中)。LockSupport.park()
Thread.state.WAITING
请参阅Thread.state.WAITING的 Java 文档。
有 3 种方法可以使线程处于 WAITING 状态:
- Object.wait 没有超时
- 没有超时的 Thread.join
- LockSupport.park
处于等待状态的线程正在等待另一个线程执行特定操作。
例如,一个对对象调用 Object.wait() 的线程正在等待另一个线程对该对象调用 Object.notify() 或 Object.notifyAll()。已调用 Thread.join() 的线程正在等待指定线程终止。
停车意味着在获得许可之前暂停执行。许可是指继续执行的许可。线程可以暂停其执行,直到允许可用。当 permit 可用时,停放的线程使用它并退出park() 方法。
LockSupport - 类采用设施基本线程阻塞原语来创建锁和其他同步类。
除非许可可用,否则方法 park() 将禁用当前线程以进行线程调度。
unpark(Thread thread) 使给定线程的许可可用(如果它尚不可用)。
像这样使用它:
finally { LockSupport.unpark(thread); }