Почему методы sleep()
и yield()
определяются как методы static
в java.lang.Thread
class
?
Java: почему Thread.sleep() и yield() являются статическими?
Ответ 1
Код будет выполняться только тогда, когда выполнялся someXThread
, и в этом случае сообщение someYThread
для вывода было бы бессмысленным. Так как единственный поток, который стоит называть yield
on, это текущий поток, они делают метод static
, поэтому вы не тратите время на вызов yield
на другой поток.
Ответ 2
Это происходит потому, что всякий раз, когда вы вызываете эти методы, они применяются в том же потоке, который запущен. Вы не можете сказать другому потоку выполнить некоторую операцию, например, sleep()
или wait
. Вся операция выполняется в потоке, который выполняется в настоящее время.
Ответ 3
Если вы вызываете метод yield
или sleep
, он применяется к любому потоку, который выполняется в настоящий момент, а не к любому конкретному потоку - вам не нужно указывать, какой поток в настоящее время выполняется, чтобы освободить процессор.
Ответ 4
По этой же причине методы stop() и suspend() устарели. Вторжение в состояние потока извне опасно и может привести к непредсказуемому результату. И если сон не является статичным, например, как вы думаете, произойдет ли его прерывание?
Ответ 5
Они статичны, поэтому можно избежать переопределения концепции, т.е.
Когда они вызываются с ссылкой на родительский класс, чтобы содержать объект дочернего класса, подобный ситуации, он реализует концепцию "Скрытие метода", а не переопределение из-за природы статического метода, т.е. запускает метод родительского класса (здесь этот класс), который имеет полную функциональность сна и выход.
Ответ 6
Оба метода сна и урока являются родными. Чтобы лучше понять ответы выше, я сделал два класса 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");
}
}