为什么sleep()
和yield()
方法被定义为static
方法java.lang.Thread
class
?
7 回答
代码只会在执行时someXThread
执行,在这种情况下告诉someYThread
yield 将毫无意义。因此,由于唯一值得调用yield
的线程是当前线程,因此他们创建了该方法static
,因此您不会浪费时间尝试调用yield
其他线程。
这是因为每当您调用这些方法时,它们都会应用在正在运行的同一线程上。您不能告诉另一个线程执行某些操作,例如,sleep()
或wait
。所有操作都在当前正在执行的线程上执行。
如果您调用yield
orsleep
方法,它适用于当前正在执行的任何线程,而不是任何特定线程 - 您不必指定当前正在运行的线程来释放处理器。
同样的原因是为什么不推荐使用 stop() 和 suspend() 方法。从外部侵入线程的状态是危险的,并且可能导致不可预知的结果。例如,如果睡眠不是静态的,你认为它会如何中断?
它们是静态的,因此可以避免压倒一切的概念,即
当使用父类引用调用它们来保存子类对象时,它实现了方法隐藏概念,并且由于静态方法的性质而不会覆盖,即父类(这里是线程类)方法将运行,具有完整的睡眠和屈服功能。
我知道我参加这个聚会迟到了,(责备我的父母:-))我想用矛盾的证据来回答这个问题。假设sleep
方法不是static
,因此您可以在任何其他线程对象上调用睡眠。
假设有两个线程,thread A
并且thread B
. 现在考虑方法上下文中的两种可能情况sleep
,同样适用yield
。
- 具有单处理器的系统一次只有一个线程处于活动状态,因此如果在对象 ie上
thread A
调用B 不在执行中,就像当前正在执行的线程一样,所以在非执行方法上调用是没有意义的。sleep
thread B
B.sleep()
thread A
sleep
- 负责任的程序员永远不会
sleep
在synchronized
块内定义,也不会在线程持有锁时定义。但是假设在持有锁(或在块内)时thread A
调用sleep
方法,持有锁会进入睡眠状态,这是完全不可取的。thread B
thread B
synchronized
thread B
这些只是迫使 jvm 不允许线程在另一个线程对象上调用睡眠的几种情况。
sleep 和 yield 方法都是原生的。为了从上面的答案中更好地理解,我用相同的静态方法制作了两个类 ClassA 和 ClassB。我调用了其他类的方法来检查它的行为。所以我们可以调用其他类的静态方法。
因此,将睡眠方法设为静态可能还有其他原因。
public class ClassA {
public static void method(){
System.out.println("Inside ClassA method");
}
public static void main(String[] args) {
method();
ClassB classb = new ClassB();
classb.method();
}
}
public class ClassB {
public static void method(){
System.out.println("Inside ClassB method");
}
}