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


86

У мене це є в коді

Thread.currentThread().sleep(x);

Eclipse каже мені використовувати статику

Thread.sleep(x); 

натомість, чому? У чому різниця, чи існує якась різниця у функціональності взагалі між цими 2 методами?


1
у "Eclipse" є "Зберегти дію", яка автоматично замінить доступ статичних членів через змінні екземпляра статичним доступом через ім'я класу - увімкніть цю дію збереження та стільки інших дій збереження, наскільки ви погоджуєтесь (наприклад, видаліть непотрібні заклики, непотрібні 'це' тощо).
les2

Відповіді:


135

Існує лише один метод, а не два, і він статичний. Хоча ви можете викликати статичний метод через посилання на екземпляр, це невдалий стиль. Це вказує на те, що програміст вважає, що він або вона викликає метод екземпляра. Розгублений програміст може думати, що він або вона можуть спричинити сплячий інший потік (не поточний) таким чином, коли це не те, що він робить.

Обидва ваші рядки коду роблять те саме, але другий - кращий стиль.


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

32

У Java сон - це статичний метод. Обидва ваші приклади роблять абсолютно те саме, але попередня версія заплутана, оскільки схоже, що вона викликає метод для певного об'єкта, але взагалі цього не робить. У вашому прикладі це не матиме великого значення, але більш небезпечно, якщо у вас є таке:

someOtherThread.sleep(x);

Цього разу виглядає так, ніби ви просите спати якусь іншу нитку, але насправді ви присипляєте поточну нитку. Спосіб уникнути помилок такого типу - це завжди викликати статичні методи, використовуючи клас, а не конкретний об’єкт.


Ви маєте на увазі, що і currentThread, і someOtherThread будуть переходити до режиму сну під час виконання цього одного рядка "someOtherThread.sleep (x);" ??
Канагавелу Сугумар

3
Ні. Поточний потік перейде в режим сну, незалежно від того, який об’єкт Thread .sleep викликаний. Ви не можете приспати інші потоки (так).
Torque

3

Два виклики методів однакові за поведінкою, оскільки вони викликають один і той же метод, але використання імені класу ( у цьому випадку Thread ), а не екземпляра для доступу до статичних полів та методів, робить цю статичність зрозумілою. Ось чому дається це попередження.

Але враховуючи, що статичні поля та методи відображаються у більшості середовищ розробки ID (зокрема, курсивом у Eclipse та IntelliJ IDEA), чи є це застереження все-таки необхідним? Можливо, не настільки необхідним, як це було на початку Java, коли використовувались прості редактори.


0

Thread.currentThread().sleep(x);або те, як Eclipse каже, що Thread.sleep(x);статичний контекст потрібен, якщо він потрібен, тому ми тримаємось на невелику затримку з цим сном.

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

Знову ж таки, використання об’єкта також має плюси і мінуси слабких, фантомних, сильних посилань ....,

Кодекс заплутаний природою. Це просто спосіб, як ми робимо, щоб зробити його функціонувати та функціонувати.


1
Якщо говорити про потік, - він породжується асинхронно, хоча ми можемо мати синхронні речі в потоках. За своєю природою речі все-все є асинхронними, хоча ми часом знаходимо речі, які є синхронними. Жодна з речей не є синхронною, навіть якщо ми втручаємося в Квант або Астрономію.
Dev Anand Sadasivam
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.