为什么在sleep()
yield()
中将static
和java.lang.Thread
方法定义为class
方法?
答案 0 :(得分:35)
代码只会在someXThread
执行时执行,在这种情况下告诉someYThread
屈服将毫无意义。因此,唯一值得调用yield
的线程是当前线程,因此他们创建方法static
,因此您不会浪费时间尝试在some other thread上调用yield
。< / p>
答案 1 :(得分:14)
这是因为无论何时调用这些方法,这些方法都应用于正在运行的同一个线程。
您不能告诉另一个线程执行某些操作,例如sleep()
或wait
。所有操作都在当前正在执行的线程上执行。
答案 2 :(得分:6)
如果调用yield
或sleep
方法,它适用于当前正在执行的任何线程,而不是任何特定线程 - 您不必指定当前正在运行的线程以释放处理器。
答案 3 :(得分:2)
同样的原因是为什么不推荐使用stop()和suspend()方法。从外部侵入线程的状态是危险的,并且可能导致不可预测的结果。例如,如果睡眠不是静止的,你认为它会如何发生中断?
答案 4 :(得分:2)
它们是静态的,因此可以避免最重要的概念,即
当使用父类引用调用它们来保存子类对象时,它实现了方法隐藏概念而不是由于静态方法性质而重写,即父类(此处为线程类)方法将运行,具有完整的睡眠功能和产量。
答案 5 :(得分:0)
睡眠和产量方法都是原生的。为了更好地理解上面的答案,我使用相同的静态方法创建了两个ClassA和ClassB类。我调用了其他类的方法来检查它的行为。所以我们可以打电话给其他班级&#39;静态方法。
因此,将睡眠方法设为静态可能还有其他原因。
mysqli
答案 6 :(得分:0)
我知道我参加这个聚会迟到了,(怪我父母 :-))
我想用反证法来回答这个问题。
假设 sleep
方法不是 static
,因此您可以在任何其他线程对象上调用 sleep。
假设有两个线程,thread A
和 thread B
。现在考虑 sleep
方法上下文中的两种可能情况,这同样适用于 yield
。
thread A
对 sleep
对象(即 thread B
)调用 B.sleep()
,B 不在执行中,因为当前正在执行的线程是 thread A
,因此在非执行方法上调用 sleep
是没有意义的。sleep
块内或线程持有锁时定义 synchronized
。但是假设 thread A
在 sleep
上调用 thread B
方法,当 thread B
持有锁(或在 synchronized
块内)时,thread B
会抱着锁睡觉,这是完全不可取的。这些只是迫使 jvm 不允许线程在另一个线程 obect 上调用 sleep 的几种情况。