29

为什么sleep()yield()方法被定义为static方法java.lang.Thread class

4

7 回答 7

35

代码只会在执行时someXThread执行,在这种情况下告诉someYThreadyield 将毫无意义。因此,由于唯一值得调用yield的线程是当前线程,因此他们创建了该方法static,因此您不会浪费时间尝试调用yield其他线程

于 2013-06-26T05:20:50.763 回答
14

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

于 2013-06-26T05:22:26.427 回答
6

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

此论坛中的类似主题

于 2013-06-26T05:21:32.410 回答
2

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

于 2013-06-26T08:55:00.917 回答
2

它们是静态的,因此可以避免压倒一切的概念,即

当使用父类引用调用它们来保存子类对象时,它实现了方法隐藏概念,并且由于静态方法的性质而不会覆盖,即父类(这里是线程类)方法将运行,具有完整的睡眠和屈服功能。

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

于 2016-04-13T08:08:42.563 回答
0

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

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

  1. 具有单处理器的系统一次只有一个线程处于活动状态,因此如果在对象 ie上thread A调用B 不在执行中,就像当前正在执行的线程一样,所以在非执行方法上调用是没有意义的。sleepthread BB.sleep()thread Asleep
  2. 负责任的程序员永远不会sleepsynchronized块内定义,也不会在线程持有锁时定义。但是假设在持有锁(或在块内)时thread A调用sleep方法,持有锁会进入睡眠状态,这是完全不可取的。thread Bthread Bsynchronizedthread B

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

于 2021-01-22T09:26:24.380 回答
0

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");
    } 

}
于 2015-12-13T08:47:10.230 回答