了解java.lang.Thread.State:WAITING(停放)

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

其次,通过在Java线程API中查看park方法

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

如果许可证可用,那么它被消耗,并且呼叫立即返回; 否则当前线程因为线程调度目的而被禁用,并且处于hibernate状态,直到发生三件事之一。

英语不是我的主要语言,所以我有一些困难的理解,我打算'允许'作为'权限停放线程',所以下面的问题:

  • 那是什么意思,什么是“许可证”,以及是谁以及如何检查这些许可证?
  • 这是什么意思:“如果许可证是可用的,那么它被消耗”,它是“停放”?
  • 如果第二点是真的,那么'停车'和'hibernate'之间有什么区别? 如果我有许可证,我可以永久停放,如果没有,我可以让它“hibernate”?

谢谢

许可证是指继续执行的许可。 停车意味着暂停执行,直到许可证可用。

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

你可以通过调用unpark()给一个线程许可。 一个线程可以挂起它的执行,直到允许可用(或者线程被中断,或者超时过期等等)通过调用park() 。 当许可证可用时,停放的线程消耗它并退出park()方法。

根据Java 线程状态文档 ,一个线程可以进入WAITING状态有三个原因:

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

在线程上调用park方法时,除非许可证可用,否则将禁用该线程以进行线程调度。 您可以调用unpark方法为给定线程提供许可证(如果尚不可用)。

所以,当你的线程在LockSupport.park处于WAITING模式时,它会显示为WAITING(停车)。

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

从描述许可证的类描述(位于LockSupport javadoc的顶部)

这个类与每个使用它的线程相关联,一个许可证 (在信号量类的意义上)。 如果许可证可用,呼叫停车场将立即返回,在此过程中消耗[许可证] ; 否则[呼叫停车]可能会阻止。 如果没有这个通行证,打电话到unpark就可以取得许可证。 (不过与信号量不同,许可证不会累积,最多只有一个)。

(我扩大了[文本] ,使非英语读者更容易阅读。)

希望有更深入的了解的人可以详细说明这一点。 见axtavt的答案。

作为最后一点,javadoc的最后一句话是:

这些方法被devise为用作创build更高级同步实用程序的工具,而且对于大多数并发控制应用程序本身并不适用。

据我所知,“许可”只是一个代表一个线程是否可以“停放”的对象。 这是由线程本身(或德JRE当你试图停放一个线程)检查“消耗”的东西,我明白,许可证消失和线程是不能解决的。

我想你应该多学一点关于multithreading的东西。把它想象成一个叫做“许可证”的对象的一个​​分配器。 你告诉一个线程停车,线程检查分配器,如果有“许可”,线程拿走并离开(没有停车)。 如果分配器中没有“许可证”,则螺纹将被停放,直到“许可证”可用(并且您可以在放置器中放置“许可证”并取消停放。

至于CPU /内存使用情况,我认为这取决于操作系统等…