当前位置: 首页 > 知识库问答 >
问题:

等待和阻塞线程状态之间的差异

萧飞
2023-03-14

线程状态WAIT和线程状态BLOCKED有什么区别?

线。国家文件:

Blocked
等待监视器锁而被阻塞的线程处于这种状态。

等待
无限期等待另一个线程执行特定操作的线程处于此状态

这不能向我解释差异。

共有3个答案

冉锋
2023-03-14

阻塞状态和等待状态之间的重要区别是对调度程序的影响。处于阻塞状态的线程正在争夺锁;该线程仍然被视为调度程序需要服务的东西,可能会被计入调度程序关于给正在运行的线程多少时间的决定中(以便它可以给锁上阻塞的线程一个机会)。

一旦线程处于等待状态,它对系统的压力就会最小化,调度程序不必担心它。它会Hibernate,直到收到通知。除了它占用一个操作系统线程之外,它完全没戏了。

这就是为什么使用notifyAll不太理想,它会导致一堆线程被唤醒,这些线程之前都处于愉快的Hibernate状态,不会给系统带来任何负担,其中大多数线程会阻塞,直到它们可以获得锁,发现它们等待的条件不正确,然后继续等待。最好只通知那些有机会取得进展的线程。

(使用 ReentrantLock 而不是内部锁,您可以为一个锁设置多个条件,以便您可以确保通知的线程是等待特定条件的线程,从而避免在线程因无法操作而收到通知的情况下丢失通知错误。

梁丘经艺
2023-03-14

区别相对简单。

在<code>阻塞

等待状态下,一个线程正在等待来自另一个线程的信号。这通常通过调用 Object.wait()Thread.join() 来实现。然后,该线程将保持此状态,直到另一个线程调用 Object.notify() 或死亡。

有骏奇
2023-03-14

线程一旦对对象调用<code>wait()notify()或notifyAll()

一旦该线程被通知,它将无法运行。可能其他线程也被通知了(使用< code>notifyAll())或者第一个线程还没有完成他的工作,所以它仍然被阻塞,直到有机会为止。这就是所谓的阻塞状态。每当一个线程试图获取对象上的锁,而另一个线程已经持有该锁时,就会出现阻塞状态。

一旦其他线程离开并且有这个线程机会,它就会移动到Runnable状态,之后它就有资格根据JVM线程机制拾取工作并移动到运行状态。

 类似资料:
  • 我的布局有表面视图。有时当我的应用程序从后台切换到前台时,我会得到ANR。我认为原因是主线程被lock方法阻塞了。 最重要的部分是:

  • 用例:每次我需要处理一个作业时创建一个新线程。 目前的实现:我使用的执行器服务与固定大小的线程池,例如50。对于每个作业,我都向executor服务提交一个新线程。 我试图实现的行为更像是自动伸缩。在高峰时间跨越更多的服务器(在本例中是线程)。并在负载不是很高的时候终止额外的服务器并保持最小的服务器计数。

  • 我们在应用程序中使用了Stomp、SpringBoot和WebSockets。服务器应用程序执行以下操作:1)生成要推送给用户的消息;2)接受WebSocket连接;3)将消息推送给ActiveMQ stomp Broker。线程转储显示了大量与simpMessagingTemplate convertAndSendToUser API调用相关联的等待线程。 应用程序的两个实例在云中运行。该应用程

  • 本文向大家介绍Java countDownLatch如何实现多线程任务阻塞等待,包括了Java countDownLatch如何实现多线程任务阻塞等待的使用技巧和注意事项,需要的朋友参考一下 我这里需要通过多线程去处理数据,然后在所有数据都处理完成后再往下执行。这里就用到了CountDownLatch。把countdownlatch作为参数传入到每个线程类里,在线程中处理完数据后执行countdo

  • 我们在其中一个模块中使用了Hystrix-断路器模式[library]。usecase是:-我们正在从kafka轮询16个消息,并使用pararllel流处理它们,因此,对于工作流中的每条消息,它需要3个rest调用,这些调用由hystric命令保护。现在,问题是当我尝试运行单个实例时,CPU显示尖峰,线程转储显示许多线程处于等待状态,等待所有3个命令。如下所示:-

  • 问题内容: 线程状态WAIT和线程状态BLOCKED有什么区别? 该Thread.State文档: 已阻止 该线程在等待监视器锁定时被阻止,处于此状态。 等待中 无限期等待另一个线程执行特定操作的线程处于此状态 没有向我解释差异。 问题答案: 线程在调用对象后进入等待状态。这称为 等待 状态。一旦线程达到等待状态,它将需要等待,直到其他线程调用或对象上。 通知此线程后,它将无法运行。可能是其他线程