我已经阅读了许多关于线程状态的文档,其中一些告诉我们有两种不同的状态:blocking(before同步)和等待(如果呼叫等待),其他人说只有一个状态:等待。此外,一些文档告诉你应该为每个wait()调用notify(),并且如果你不这样做,那么即使监视器被解锁,线程waiting()也永远不会被执行。是否有任何区别,如果线程正在等待监视器在同步块之前被释放,或者它调用wait()
回答
从你上一句我看你不完全明白和wait()
/notify()
之间的区别。
基本上,显示器有锁和条件。这几乎是正交的概念。
当线程输入一个块时,它获得一个锁。当线程离开该块时,它释放一个锁。只有一个线程可以在特定的监视器上锁定。
当有锁的线程调用
wait()
时,它释放锁并开始等待其状态。当具有锁的线程调用notify()
时,等待条件的其中一个线程(在notifyAll()
的情况下的所有线程)变为符合执行条件(并且由于通知线程仍有它,因此开始等待获取锁)。
所以,等待获取锁(Thread.State.BLOCKED),并等待显示器的状态(Thread.State.WAITING)是不同的,独立的国家。
如果您看到Lock
类 - 它实现与块(具有一些扩展)相同的同步原语,但在锁和条件之间提供了明显区别,此行为变得更加清晰。
当一个线程调用
Object.wait
方法,它会释放此收购 监测和(如果我们调用超时 版本的wait方法或TIMED_WAITING
)状态投入WAITING
。 现在,当该线程要么 通过notify()
或通过notifyAll()
呼叫上 相同的对象,则等待状态的线程端 和线程通知 开始试图恢复其已在 时间的获取的所有的 监视器等待电话。一次有 可能是几个线程试图 重新获得(或可能获得第一个 时间)他们的显示器。如果多于一个的线程 试图获得一个特定的对象,然后仅一个 螺纹(由JVM
调度选择的) 的监视器 被授予监视和所有其他 线程被置于BLOCKED
状态。
还有two different states BLOCKED和WAITING。
如果没有人通知(或中断)你是真的,那么关于永久等待的部分。
非常感谢您的链接 – dhblah 2010-10-06 14:43:13
在Java的角度(Thread.State),有两种不同的状态:BLOCKED和WAITING。当一个线程在一个Object上同步时,它处于BLOCKED状态。线程执行等待后,它处于WAITING状态。
在Linux平台上,Java线程是OS本地线程。 BLOCKED和WAITING状态的OS线程状态是可中断的睡眠。使用ps进行检查时,BLOCKED和WAITING线程的状态为“S1 +”。
- 1. 在同步块中使用wait()方法时,JVM会在等待notify()时释放监视器吗?
- 2. Java:线程在对象上等待时是否释放所有监视器?
- 3. 线程等待监视器
- 4. 在C#中使用监视等待/脉冲线程同步
- 5. 是否需要在同步块内使用线程wait()和notify()?
- 6. 在异步方法调用.Wait()和Task.Run()之间的区别Wait()
- 7. 线程正在等待异步回调
- 8. 任何人都可以解释线程监视器并等待吗?
- 9. 如何查看哪个监视器是等待的线程?
- 10. 在当前正在执行的线程死亡之前等待
- 11. Java线程正在等待未被任何其他线程占用的锁
- 12. 并发线程正在等待任务
- 13. before_create是否被调用,如果在它之前的验证中有错误?
- 14. 等待锁定被释放
- 15. ManualResetEventSlim:调用.SET()紧跟.reset段()不释放任何* *等待的线程
- 16. 异步方法 - 等待和返回任务之间的区别
- 17. Java/Scala ThreadPool:如何在等待时释放线程?
- 18. 等待文件被进程释放
- 19. 如何替换Java信号量的获取和释放与Java监视器同步,等待和通知(全部)
- 20. 等待/异步跨线程调用?
- 21. 在Java中等待同步方法的线程是否有超时?
- 22. BlockingQueue和释放等待中的线程
- 23. wait()不强制线程等待?
- 24. 在生产者继续之前等待所有异步消费者完成
- 25. 它是否有任何意义或价值调用保留或释放自动释放对象?
- 26. 等待同步异步方法在同一线程上完成
- 27. 从监视器的所有者的另一个线程释放锁
- 28. 线程和正在等待
- 29. 线程正在等待ThreadPoolExecutor
- 30. 有没有办法使用JavaScript来检查是否有任何AJAX调用当前正在等待响应?
您的意思是说,notify()更改了显示器的状态?但是notifyAll()呢呢?这是否意味着监视器有一系列条件,每个线程都有一个条件。此外,线程是如何检查条件或锁定的,检查无限循环(while!monitor.lock)还是(while!monitor.condition [threadNum])?附:在这里我讲的是简单的监视器(对象),我不熟悉高层次的并发机制(是否有人使用它?) – dhblah 2010-10-06 13:47:36
@gasan:Monitor的条件不是一般意义上的条件,它是一个同步原语,所以它不能改变。它只有一组等待它的线程。 'notifyAll()'和'notify()'的工作方式相同,但是对于等待条件的所有线程都是如此。 – axtavt 2010-10-06 14:06:04