公司做网站费用记到哪个科目,网络运维与安全就业方向,安徽中兴建设工程有限公司网站,wordpress 0dayjava线程池返回线程状态介绍 在Java中#xff0c;线程可以具有状态。 Thread.State枚举定义Java线程可以具有的不同状态。 该枚举定义了以下值– 新 可运行 已封锁 等候 TIMED_WAITING 已终止 在随后的部分中#xff0c;我将简要概述这些状态以及它们之间的可能过渡。… java线程池返回线程状态 介绍 在Java中线程可以具有状态。 Thread.State枚举定义Java线程可以具有的不同状态。 该枚举定义了以下值– 新 可运行 已封锁 等候 TIMED_WAITING 已终止 在随后的部分中我将简要概述这些状态以及它们之间的可能过渡。 Java线程的状态 新 这是线程首次创建时获得的默认状态。 可运行 线程一开始执行就立即进入RUNNABLE状态。 请注意等待获取CPU来执行的线程仍处于此状态。 已封锁 一旦线程被阻塞以等待监视器锁定线程便立即进入BLOCKED状态。 这可以通过以下两种方式之一发生 它正在等待获取锁定以输入同步的块/方法。 它正在等待重新获取对其调用Object.wait方法的对象的监视器锁定。 等候 线程由于调用以下方法之一而进入此状态– Object.wait没有超时 Thread.join没有超时 LockSupport.park TIMED_WAITING 线程由于调用以下方法之一而进入此状态– 线程睡眠 Object.wait超时 Thread.join超时 LockSupport.parkNanos LockSupport.parkUntil 已终止 线程终止后它将立即移至该状态。 可能的状态转换 下图显示了不同状态之间可能的转换– 安排执行线程后它将立即进入RUNNABLE状态。 已经用第一个箭头标记为1显示了此过渡。 从RUNNABLE状态线程可以移至BLOCKEDWAITINGTIMED_WAITING或TERMINATED状态中的任何一个。 从理论上讲如果线程不等待获取任何锁或者不Hibernate或者不调用任何使其等待的方法则它仅完成执行并直接进入TERMINATED状态标记为2d。 当然在实际应用中上述情况极不可能发生。 通常线程尝试获取锁在这种情况下如果必须等待锁则它将进入BLOCKED标记为2a状态。 线程还明确地等待某些先决条件为真/来自其他线程的操作在这种情况下线程将根据等待是否计时而移至WAITING标记为2b或TIMED_WAITING标记为2c状态。 一旦线程移至BLOCKED状态接下来唯一允许的过渡就是移至RUNNABLE状态标记为3d。 同样从等待状态的唯一可能转换是移动到已阻止状态标记为3c。 请注意Internet上的某些文章错误地添加了从WAITING到RUNNABLE状态的过渡。 这只是不正确的。 线程永远不能直接从WAITING状态进入RUNNABLE状态。 我们可以通过一个例子来了解其原因。 假设我们有一个线程T该线程当前处于RUNNABLE状态并持有三个对象ab和c的监视器锁定如下图所示– 此时T调用c.wait此后它不再持有对象c的监视器锁定– 一旦通过调用notify / notifyAll通知T它将停止等待并与其他线程例如X和Y竞争以获取c的监视器锁定– 根据上面的定义它是BLOCKED状态。 仅在获得了c的监视器锁定后T才进入RUNNABLE状态。 可以对Thread.join内部使用Object.wait和LockSupport.park应用类似的推理。 让我们回到原始状态转换图。 如我们所见线程可以从TIMED_WAITING状态移动到RUNNABLE标记为3b或BLOCKED标记为3a状态。 在这种情况下可以转换为RUNNABLE因为线程可以在调用Thread.sleep方法之后进入TIMED_WAITING状态在这种情况下该线程将保留其当前持有的所有监视器锁定。 在线程在RUNNABLEBLOCKEDWAITING或TIMED_WAITING状态之间来回移动之后线程完成执行时它将一劳永逸地进入TERMINATED状态。 我们如何获得线程的当前状态 我们可以使用Thread.getState方法来检索线程的当前状态。 我们可以使用此值来监视或调试应用程序在生产中可能遇到的任何并发问题。 结论 在本文中我们简要回顾了Java线程可以具有的不同状态以及线程如何在这些状态之间移动。 与往常一样任何反馈/改进建议/评论都将受到高度赞赏 翻译自: https://www.javacodegeeks.com/2019/01/different-states-java-threads.htmljava线程池返回线程状态