Java:为什么Thread.sleep()和yield()是静态的?

时间:2013-06-26 05:16:47

标签: java multithreading

为什么在sleep() yield()中将staticjava.lang.Thread方法定义为class方法?

7 个答案:

答案 0 :(得分:35)

代码只会在someXThread执行时执行,在这种情况下告诉someYThread屈服将毫无意义。因此,唯一值得调用yield的线程是当前线程,因此他们创建方法static,因此您不会浪费时间尝试在some other thread上调用yield。< / p>

答案 1 :(得分:14)

这是因为无论何时调用这些方法,这些方法都应用于正在运行的同一个线程。    您不能告诉另一个线程执行某些操作,例如sleep()wait。所有操作都在当前正在执行的线程上执行。

答案 2 :(得分:6)

如果调用yieldsleep方法,它适用于当前正在执行的任何线程,而不是任何特定线程 - 您不必指定当前正在运行的线程以释放处理器。

similar thread in this forum

答案 3 :(得分:2)

同样的原因是为什么不推荐使用stop()和suspend()方法。从外部侵入线程的状态是危险的,并且可能导致不可预测的结果。例如,如果睡眠不是静止的,你认为它会如何发生中断?

答案 4 :(得分:2)

它们是静态的,因此可以避免最重要的概念,即

当使用父类引用调用它们来保存子类对象时,它实现了方法隐藏概念而不是由于静态方法性质而重写,即父类(此处为线程类)方法将运行,具有完整的睡眠功能和产量。

http://i.stack.imgur.com/goygW.jpg

答案 5 :(得分:0)

睡眠和产量方法都是原生的。为了更好地理解上面的答案,我使用相同的静态方法创建了两个ClassA和ClassB类。我调用了其他类的方法来检查它的行为。所以我们可以打电话给其他班级&#39;静态方法。
因此,将睡眠方法设为静态可能还有其他原因。

mysqli

答案 6 :(得分:0)

我知道我参加这个聚会迟到了,(怪我父母 :-)) 我想用反证法来回答这个问题。 假设 sleep 方法不是 static,因此您可以在任何其他线程对象上调用 sleep。

假设有两个线程,thread Athread B。现在考虑 sleep 方法上下文中的两种可能情况,这同样适用于 yield

  1. 具有单处理器的系统一次只有一个线程处于活动状态,因此如果 thread Asleep 对象(即 thread B)调用 B.sleep(),B 不在执行中,因为当前正在执行的线程是 thread A,因此在非执行方法上调用 sleep 是没有意义的。
  2. 负责任的程序员永远不会在 sleep 块内或线程持有锁时定义 synchronized。但是假设 thread Asleep 上调用 thread B 方法,当 thread B 持有锁(或在 synchronized 块内)时,thread B 会抱着锁睡觉,这是完全不可取的。

这些只是迫使 jvm 不允许线程在另一个线程 obect 上调用 sleep 的几种情况。