Java - Получающий доступ ко Сну Статического метода - Что случилось?

Когда я поместил код ниже в NetBeans, NetBeans дает мне предупреждение рядом с ним высказывание, "Получающее доступ ко сну статического метода".

        try {
            Thread.currentThread().sleep(2000);
        }
        catch(InterruptedException ie){
            //continue
        }

Я делаю что-то не так? Я должен называть это по-другому? Я не делаю ничего многопоточного. У меня просто есть простой основной метод то, что я хочу спать некоторое время.

7
задан Greg 9 August 2010 в 13:12
поделиться

6 ответов

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'.

10
ответ дан 6 December 2019 в 08:13
поделиться

sleep является статическим, поэтому вы обращаетесь к нему с помощью Thread.sleep(2000);. Она воздействует на текущий поток.

Из javadoc:

Заставляет текущий выполняющийся поток заснуть (временно прекратить выполнение) на указанное число миллисекунд. Поток не теряет права собственности на какие-либо мониторы.

Это означает, что вы не можете усыпить другой поток, только тот, в котором находится код.

6
ответ дан 6 December 2019 в 08:13
поделиться

Это потому, что метод sleep() объявлен как статический, поэтому

Thread.currentThread().sleep(2000);

это то же самое, что

Thread.sleep(2000);
2
ответ дан 6 December 2019 в 08:13
поделиться

У экземпляров 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); - никогда не обращайтесь к статическим методам через экземпляр, чтобы избежать путаницы и этого предупреждения.

2
ответ дан 6 December 2019 в 08:13
поделиться

netbeans выдает предупреждение, потому что вы обращаетесь к статическому методу из ссылки Thread, а не из класса Thread. Попробуйте это

try {
            Thread.sleep(2000);
        }
        catch(InterruptedException ie){
            //continue
        }

метод sleep Приводит текущий выполняющийся поток в спящее состояние, поэтому нет необходимости вызывать Thread.currentThread().

1
ответ дан 6 December 2019 в 08:13
поделиться

Всякий раз, когда вы пытаетесь получить доступ к статическому методу, используя объект, это не лучшая практика, NB выдает предупреждение в это время, вот тот же случай

Thread.currentThread() вернет вам объект Thread

1
ответ дан 6 December 2019 в 08:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: