Когда я поместил код ниже в NetBeans, NetBeans дает мне предупреждение рядом с ним высказывание, "Получающее доступ ко сну статического метода".
try {
Thread.currentThread().sleep(2000);
}
catch(InterruptedException ie){
//continue
}
Я делаю что-то не так? Я должен называть это по-другому? Я не делаю ничего многопоточного. У меня просто есть простой основной метод то, что я хочу спать некоторое время.
Thread.currentThread() возвращает экземпляр класса Thread. При вызове статического метода вы хотите работать только с самим классом. Поэтому при вызове статического метода на текущем потоке вы получите предупреждение, что вызываете метод на экземпляре.
Вы просто вызовете Thread.sleep(2000);
Это будет эквивалентно Thread.currentThread.sleep(2000);
Это важно знать, потому что люди обжигались, делая что-то вроде:
Thread a = new Thread(someRunnable);
a.start();
a.sleep(2000); //this will sleep the current thread NOT a.
Edit: Так как же нам заснуть? Вы засыпаете a, записывая вызов sleep внутри runnable, переданного в конструктор, например:
Runnable someRunnable = new Runnable(){
public void run(){
Thread.sleep(2000);
}
};
Когда запускается 'a', Thread.currentThread в методе run некоторой runnable является экземпляром потока 'a'.
sleep
является статическим, поэтому вы обращаетесь к нему с помощью Thread.sleep(2000);
. Она воздействует на текущий поток.
Из javadoc:
Заставляет текущий выполняющийся поток заснуть (временно прекратить выполнение) на указанное число миллисекунд. Поток не теряет права собственности на какие-либо мониторы.
Это означает, что вы не можете усыпить другой поток, только тот, в котором находится код.
Это потому, что метод sleep() объявлен как статический, поэтому
Thread.currentThread().sleep(2000);
это то же самое, что
Thread.sleep(2000);
У экземпляров Thread нет метода, соответствующего "sleep(long)".
Thread.currentThread().sleep(2000); компилируется, однако, потому что в классе Thread есть метод, который называется sleep() с аргументом long.
Java допускает это как трюк компилятора, чтобы новые кодеры могли выполнить это, когда они запутаются в статическом доступе к методам.
Однако в компиляторе это выглядит так:
Thread.sleep(2000);
Следующий код также эквивалентен:
Thread t = new Thread(new Runnable() { public void run() { // ничего не делать } }); t.sleep(2000);
Как заметил один из авторов (John V), это не заставляет реальный экземпляр потока (t) спать - спать укладывается текущий поток, создавший объект потока.
Предупреждение существует для того, чтобы вы помнили, что обращаетесь к статическому методу класса, а не к методу переменной экземпляра.
Правильный код всегда Thread.sleep(2000); - никогда не обращайтесь к статическим методам через экземпляр, чтобы избежать путаницы и этого предупреждения.
netbeans выдает предупреждение, потому что вы обращаетесь к статическому методу из ссылки Thread, а не из класса Thread. Попробуйте это
try {
Thread.sleep(2000);
}
catch(InterruptedException ie){
//continue
}
метод sleep Приводит текущий выполняющийся поток в спящее состояние, поэтому нет необходимости вызывать Thread.currentThread().
Всякий раз, когда вы пытаетесь получить доступ к статическому методу, используя объект, это не лучшая практика, NB выдает предупреждение в это время, вот тот же случай
Thread.currentThread() вернет вам объект Thread