Java - Доступ к статическому методу Sleep - Что не так? - PullRequest
7 голосов
/ 09 августа 2010

Когда я помещаю приведенный ниже код в NetBeans, рядом с ним NetBeans выдает предупреждение «Доступ к статическому методу сна».

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

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

Ответы [ 6 ]

10 голосов
/ 09 августа 2010

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.

Редактировать: Так как же нам спать? Вы засыпаете a, записывая вызов sleep внутри runnable, переданного в конструктор, например:

Runnable someRunnable = new Runnable(){
    public void run(){
        Thread.sleep(2000);
    }
};

Когда запускается «a», Thread.currentThread в методе запуска someRunnable является экземпляром потока «a».

6 голосов
/ 09 августа 2010

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

Из Javadoc:

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

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

2 голосов
/ 09 августа 2010

В экземплярах Thread нет метода, соответствующего "sleep (long)".

Thread.currentThread () сон (2000). компилируется, однако, потому что в классе потока есть метод с именем sleep () с длинным аргументом.

Java допускает это как трюк времени компилятора, чтобы новые кодеры могли выполнять это, когда они не уверены в статическом доступе к методам.

Однако в компиляторе это действительно разрешается:

Thread.sleep (2000);

Следующий код также эквивалентен:

Thread t = new Thread (new Runnable () {public void run () {// ничего не делать}}); t.sleep (2000);

Как указал один из авторов (Джон V), ​​это не приводит к тому, что фактический экземпляр потока (t) спит - текущий поток, создавший объект потока, переводится в спящий режим.

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

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

2 голосов
/ 09 августа 2010

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

Thread.currentThread().sleep(2000);

совпадает с

Thread.sleep(2000);
1 голос
/ 09 августа 2010

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

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

1 голос
/ 09 августа 2010

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

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

метод сна Заставляет текущий выполняющийся поток спать. Так что нет необходимости вызывать Thread.currentThread ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...