Java: Thread.currentThread (). Sleep (x) против Thread.sleep (x) - PullRequest
80 голосов
/ 16 января 2010

У меня есть это в моем коде

Thread.currentThread().sleep(x);

Затмение говорит мне использовать статический

Thread.sleep(x); 

вместо этого, почему? В чем разница, есть ли какая-то разница в функциональности между этими двумя методами?

Ответы [ 4 ]

128 голосов
/ 16 января 2010

Существует только один метод, а не два, и он статический. Хотя вы можете вызывать статический метод через ссылку на экземпляр, это не очень хороший стиль. Это означает, что программист думает, что он или она вызывает метод экземпляра. Запутанный программист может подумать, что он или она может заставить другой поток (не текущий) спать таким образом, когда это не так.

Обе ваши строки кода делают одно и то же, но вторая - лучший стиль.

30 голосов
/ 16 января 2010

В Java сон является статическим методом. Оба ваших примера делают одно и то же, но прежняя версия сбивает с толку, потому что похоже, что она вызывает метод для определенного объекта, но не делает этого вообще. В вашем примере это не имеет большого значения, но более опасно, если у вас есть следующее:

someOtherThread.sleep(x);

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

3 голосов
/ 16 января 2010

Два вызова метода идентичны по поведению, поскольку они вызывают один и тот же метод, но с использованием имени класса (в данном случае Thread ), а не экземпляра для доступа к статическим полям и методам, что делает эту статичность понятной. Вот почему это предупреждение производится.

Но если учесть, что статические поля и методы показываются особым образом в большинстве IDE (например, курсивным шрифтом в Eclipse и IntelliJ IDEA), все еще необходимо это предупреждение? Может быть, это не так необходимо, как в первые дни Java, когда использовались простые редакторы.

0 голосов
/ 03 декабря 2015

Thread.currentThread().sleep(x); или как Eclipse говорит об этом Thread.sleep(x); требуется статический контекст, если он необходим, поэтому мы немного задерживаемся с этим сном.

Статическая парадигма, заданная одним объектом, влияет только на этот жизненный цикл печати кучи конкретного объекта, опять же, учитывая, что статический жизненный цикл объекта не является таким уж утомительным, при необходимости его можно использовать для облегчения кодирования, но делать это нужно осторожно, так как статический отпечаток ссылается как Class (например: - Class.forName(pkg.className)) как имя по имени, а не как любой object, который является единственной печатной копией класса в памяти HEAP.

Опять же, использование объекта также имеет свои плюсы и минусы от Weak, Phantom, Strong вроде ссылок ....,

Код запутан природой. Это так, как мы делаем, чтобы заставить его работать и функционировать.

...