为什么三个"阻止" Java中的线程状态但C#中只有一个?

时间:2017-01-26 13:15:16

标签: java c# multithreading

在Java中,有三个不同的"阻塞"线程状态:BLOCKED,WAITING和TIMED_WAITING。 (the manual)

在C#中,只有一个"阻塞" state:WaitSleepJoin。 (the manual)

为什么呢?我只能猜测Java和C#各自的实现方式不同。我真的没有看到为什么应该有三个的实际原因。有没有? (我第一次学习了C#的锁定块,Monitor.pulseAll()等,今天用Java调试了一个半小时,因为我假设了Java的同步块,Object#notifyAll()等我知道他们现在的表现如何,但我不明白为什么。)

1 个答案:

答案 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