在Java中,有三个不同的"阻塞"线程状态:BLOCKED,WAITING和TIMED_WAITING。 (the manual)
在C#中,只有一个"阻塞" state:WaitSleepJoin。 (the manual)
为什么呢?我只能猜测Java和C#各自的实现方式不同。我真的没有看到为什么应该有三个的实际原因。有没有? (我第一次学习了C#的锁定块,Monitor.pulseAll()等,今天用Java调试了一个半小时,因为我假设了Java的同步块,Object#notifyAll()等我知道他们现在的表现如何,但我不明白为什么。)
答案 0 :(得分:2)
在java中,我们在同步对象上使用WAITING和TIMED_WAITING。如果某个线程处于WAITING状态,则另一个线程必须使用notify()
TIMED_WAITING与WAITING相同,但在超过指定的时间参数时会自动继续。
当线程想要运行时,线程处于BLOCKED状态,但由于在同一个同步对象上运行的另一个线程,它无法运行。
因为我们可以看到TIMED_WAITING与WAITING相同,但会在指定时间后停止等待。
但为什么java分开BLOCKED和WAITING?这是因为它们如上所述是不同的。 BLOCKED表示线程是可运行的,但由于正在运行的另一个线程,它无法运行。 WAITING状态正等待调用notify()
为什么C#只有一个状态只是一个设计决策。所有java方法都表明线程没有处于可运行状态,而C#只是决定将这三种状态组合在一个变体中:WaitSleepJoin