了解 java.lang.Thread.State: WAITING (parking)

2022-08-31 10:20:03

首先,一个非常愚蠢的问题,我只是想知道等待的“停车”是什么意思?线程是等待停放还是刚刚停放,因此处于等待状态?当停车发生时,占用了多少CPU /内存资源?停放线程的目的是什么?

二、通过查看java线程API中的park方法

禁用当前线程以进行线程调度,除非许可证可用。

如果许可证可用,则使用它,并且呼叫立即返回;否则,当前线程将因线程调度目的而被禁用并处于休眠状态,直到发生以下三种情况之一.....

英语不是我的主要语言,所以我很难理解,我打算将“许可”作为“允许停放线程”,所以下面的问题:

  • 这是什么意思,什么是“许可证”,谁以及如何检查这些许可证?
  • 这是什么意思:“如果许可证可用,那么它就被消耗了”,它是否被“停放”了?
  • 接下来,如果第二点是正确的,那么“停车”和“休眠”有什么区别?如果我有许可证,我可以永远停车,如果没有,我可以让它“休眠”?

谢谢


答案 1

“允许”表示继续执行的权限。停车意味着暂停执行,直到获得许可证。

Semaphore 的许可证不同,的许可证与线程相关联(即许可证被授予特定线程)并且不会累积(即每个线程只能有一个许可证,当线程使用许可证时,它会消失)。LockSupport

您可以通过调用 来为线程授予许可。线程可以通过调用 来暂停其执行,直到允许可用(或线程中断,或超时过期等)当许可证可用时,停放的线程将使用它并退出方法。unpark()park()park()


答案 2

根据 java 线程状态文档,线程可以进入等待状态,原因有三:

  1. Object.wait,没有超时
  2. 没有超时的线程.连接
  3. LockSupport.park

在 Thread 上调用 park 方法时,除非允许可用,否则它将出于线程调度目的禁用该线程。您可以调用 unpark 方法来使给定线程的许可证可用(如果该线程尚不可用)。

因此,当您的线程通过LockSupport.park处于等待模式时,它将显示您为等待(停车)。

请注意,您只能在当前线程上调用park。这是实现生产者-消费者设计模式的非常有用的机制。