Java: Thread.currentThread (). Sleep (x) против Thread.sleep (x)


86

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

Thread.currentThread().sleep(x);

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

Thread.sleep(x); 

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


1
в Eclipse есть «действие сохранения», которое автоматически заменяет доступ к статическим членам через переменные экземпляра статическим доступом через имя класса - включите это действие сохранения и многие другие действия сохранения, с которыми вы согласны (например, удалите ненужные приведения, ненужные 'это' и т. д.).
les2

Ответы:


135

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

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


24
+1 к упоминанию, что программист может захотеть перевести конкретный поток в спящий режим через someThread.sleep (), чего он не делает.
Chii

32

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

someOtherThread.sleep(x);

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


Вы имеете в виду, что и currentThread, и someOtherThread перейдут в спящий режим при выполнении этой единственной строки «someOtherThread.sleep (x);» ??
Канагавелу Сугумар

3
Нет. Текущий поток перейдет в спящий режим независимо от того, какой объект Thread .sleep вызван. Вы не можете усыпить другие ThreadS (вот так).
Torque

3

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

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


0

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

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

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

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


1
Говоря о потоке, он создается асинхронно, хотя у нас могут быть синхронные вещи в потоках. По своей природе вещи, все вещи асинхронны, хотя иногда мы находим вещи, которые синхронны. Ничто из этого не синхронно, даже если мы вторгаемся в квантовую или астрономию.
Дев Ананд Садасивам
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.