为什么是三个;“封锁”;Java中的线程状态,但C中只有一个?

为什么是三个;“封锁”;Java中的线程状态,但C中只有一个?,java,c#,multithreading,Java,C#,Multithreading,在Java中,有三种不同的“阻塞”线程状态:阻塞、等待和定时等待 在C#中,只有一种“阻塞”状态:WaitSleepJoin 为什么??我只能猜测Java和C#各自的实现是不同的。我真的看不出有任何实际的理由为什么应该有三个。有吗?(我首先学习了C#的lock block、Monitor.pulsell()等,今天花了一个半小时用Java调试,因为我假设Java的synchronized block、Object#notifyAll()等。我现在知道它们的行为有什么不同,但我不明白为什么。)在J

在Java中,有三种不同的“阻塞”线程状态:阻塞、等待和定时等待

在C#中,只有一种“阻塞”状态:WaitSleepJoin


为什么??我只能猜测Java和C#各自的实现是不同的。我真的看不出有任何实际的理由为什么应该有三个。有吗?(我首先学习了C#的lock block、Monitor.pulsell()等,今天花了一个半小时用Java调试,因为我假设Java的synchronized block、Object#notifyAll()等。我现在知道它们的行为有什么不同,但我不明白为什么。)

在Java中,我们在同步对象上使用等待和定时等待。如果一个线程处于等待状态,则另一个线程必须使用
notify()

TIMED_WAITING与WAITING相同,但当超过指定的时间参数时,它将自动继续

当线程想要运行时,线程处于阻塞状态,但由于另一个线程正在同一同步对象上运行,因此它无法运行

因此,正如我们所看到的,TIMED_WAITING与WAITING完全相同,但在指定的时间后将停止等待

但是为什么java将阻塞和等待分离?这是因为如上所述,它们是不同的。阻塞意味着一个线程是可运行的,但由于另一个线程正在运行而无法运行。等待状态只是等待调用
notify()

为什么C#只有一个状态只是一个设计决策。所有java方法都表明线程没有处于可运行状态,而C#只是决定将这三种状态组合成一个变体:
WaitSleepJoin

java和C#是两种不同的语言,由不同的公司分别开发。没有理由期望两种语言中的类似功能以完全相同的方式工作。@Jesper不完全如此,微软向Sun/Oracle支付了大量许可费:“当他们进行.NET设计时,他们基本上是从Java规范中剪切和粘贴的。”