【问题标题】:What circmustances can cause a thread to be transferred from the wait queue to the blocked queue?什么情况会导致线程从等待队列转移到阻塞队列?
【发布时间】:2017-01-24 18:34:34
【问题描述】:

在什么情况下会发生这种情况?

据我所知

阻塞队列是产生对象和消费对象的线程之间的缓冲区。

等待队列防止线程竞争同一个锁。

所以线程获得了锁,但由于它现在很忙,所以无法传递给消费者?

【问题讨论】:

  • 这两件事彼此无关。 BlockingQueues 包含对象,而不是线程。线程从/向队列读取和写入,它们不会被“转移”到它。
  • 你应该检查这个问题:stackoverflow.com/questions/15680422/…
  • 对不起,如果它没有多大意义,但标题直接来自我过去的考试,发现它相当混乱。为链接欢呼。
  • 这是你的考试??祝你好运!!

标签: java concurrency scheduling


【解决方案1】:

这个问题只有在假设它实际上意味着“什么情况会导致线程从wait状态更改blocked状态?”

可能有一个特定的调度程序实现将这些线程维护在一个专用队列中,必须在这些状态变化时将线程从一个队列移动到另一个队列,并影响最初提出问题的人的思维定势,但这样的问题不应该加载假定的实现细节。附带说明一下,虽然 runnable 线程的队列是有意义的,但我无法想象将 blockedwaiting 线程放入(全局)队列的真正理由。

如果这是问题的初衷,则不应将其与实现队列并具有相似名称的 Java 类混淆。

  • 如果线程在另一个线程拥有对象监视器时尝试进入synchronized 方法或代码片段,则该线程处于blocked 状态。从那里,如果所有者释放监视器并且被阻塞的线程成功获取监视器,则线程将转到runnable状态

  • 一个线程处于waiting状态如果执行一个只能继续的显式动作,如果另一个线程执行一个关联的动作,即如果线程在一个对象上调用wait,它只能在以下情况下继续另一个线程在同一个对象上调用notify。如果线程调用LockSupport.park(),另一个线程必须以该线程作为参数调用LockSupport.unpark()。当它在另一个线程上调用join 时,该线程必须结束其执行以结束等待。 waiting 状态也可能由于中断spuruios唤醒而结束。

  • 作为一种特殊情况,如果线程在超时或执行Thread.sleep 时调用上述方法,Java 认为线程处于timed_waiting 状态。此状态与waiting 状态的不同之处仅在于该状态也可能由于经过的时间而结束。

当线程在对象上调用wait 时,它必须拥有该对象的监视器,即位于synchronized 方法或代码块内。监视器在此调用时被释放,并在返回时重新获取。当不能立即重新获取时,线程会从waitingtimed_waiting状态进入blocked状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-16
    • 2017-09-13
    • 1970-01-01
    • 2011-12-01
    • 2014-10-16
    • 1970-01-01
    • 2019-02-12
    • 2018-06-26
    相关资源
    最近更新 更多