Java: Thread.currentThread (). Sleep (x) vs. Thread.sleep (x)

85

Ich habe das in meinem Code

Thread.currentThread().sleep(x);

Eclipse fordert mich auf, die Statik zu verwenden

Thread.sleep(x); 

stattdessen warum? Was ist der Unterschied, gibt es überhaupt einen Unterschied in der Funktionalität zwischen diesen beiden Methoden?

Omu
quelle
1
In Eclipse gibt es eine 'Aktion speichern', die den Zugriff statischer Mitglieder über Instanzvariablen automatisch durch statischen Zugriff über den Klassennamen ersetzt. Aktivieren Sie diese Aktion speichern und so viele andere Speicheraktionen, wie Sie zustimmen (z. B. unnötige Casts entfernen, unnötig 'dies' usw.).
Les2

Antworten:

134

Es gibt nur eine Methode, nicht zwei, und sie ist statisch. Sie können eine statische Methode zwar über eine Instanzreferenz aufrufen, sie ist jedoch kein guter Stil. Es zeigt an, dass der Programmierer glaubt, eine Instanzmethode aufzurufen. Ein verwirrter Programmierer könnte denken, dass er oder sie einen anderen Thread (nicht den aktuellen) dazu bringen kann, auf diese Weise zu schlafen, wenn dies nicht der Fall ist.

Beide Codezeilen machen dasselbe, aber die zweite ist ein besserer Stil.

Sean Owen
quelle
24
+1 zu erwähnen, dass der Programmierer möglicherweise einen bestimmten Thread über someThread.sleep () in den Ruhezustand versetzen möchte, was er nicht tut.
Chii
32

In Java ist Sleep eine statische Methode. Ihre beiden Beispiele machen genau dasselbe, aber die frühere Version ist verwirrend, weil es so aussieht, als würde sie eine Methode für ein bestimmtes Objekt aufrufen, aber das tut sie überhaupt nicht. In Ihrem Beispiel spielt es keine Rolle, aber es ist gefährlicher, wenn Sie Folgendes haben:

someOtherThread.sleep(x);

Dieses Mal sieht es so aus, als würden Sie einem anderen Thread sagen, er solle schlafen, aber tatsächlich setzen Sie den aktuellen Thread in den Ruhezustand. Um diese Art von Fehlern zu vermeiden, müssen Sie statische Methoden immer mit der Klasse und nicht mit einem bestimmten Objekt aufrufen.

Mark Byers
quelle
Meinen Sie damit, dass sowohl currentThread als auch someOtherThread schlafen gehen, während diese einzelne Zeile "someOtherThread.sleep (x)" ausgeführt wird? ??
Kanagavelu Sugumar
3
Nein. Der aktuelle Thread wird in den Ruhezustand versetzt, unabhängig davon, welches Thread-Objekt .sleep aufgerufen wird. Sie können andere ThreadS nicht in den Ruhezustand versetzen (so).
Drehmoment
3

Die beiden Methodenaufrufe sind im Verhalten identisch, da sie dieselbe Methode aufrufen, aber die Verwendung des Klassennamens ( in diesem Fall Thread ) anstelle einer Instanz für den Zugriff auf statische Felder und Methoden diese Statizität deutlich macht. Deshalb wird diese Warnung ausgegeben.

Ist diese Warnung jedoch weiterhin erforderlich, wenn man bedenkt, dass statische Felder und Methoden in den meisten IDEs auf bestimmte Weise angezeigt werden (z. B. in kursiver Schrift in Eclipse und IntelliJ IDEA)? Vielleicht nicht so notwendig wie in den frühen Tagen von Java, als einfache Editoren verwendet wurden.

Amir Moghimi
quelle
0

Thread.currentThread().sleep(x);oder die Art und Weise, wie Eclipse sagt, dass Thread.sleep(x);statischer Kontext erforderlich ist, wenn dies erforderlich ist, sodass wir uns mit diesem Schlaf für eine leichte Verzögerung festhalten.

Das statische Paradigma, das von einem Objekt festgelegt wird, wirkt sich nur auf diesen bestimmten Lebenszyklus des Objekt-Heap-Drucks aus. Auch hier ist der statische Gesamtlebenszyklus des Objekts nicht so störend. Bei Bedarf kann er zur Vereinfachung der Codierung verwendet werden, muss jedoch sorgfältig als statischer Fuß ausgeführt werden. print wird von Class(zum Beispiel: - Class.forName(pkg.className)) als gleichnamig bezeichnet und nicht von einer objecteinzelnen Laufzeitkopie der Klasse im HEAPSpeicher.

Wieder hat die Verwendung von Objekten auch Vor- und Nachteile von Weak, Phantom, Strong Art von Referenzen ....,

Code ist von Natur aus verschlungen. Es ist genau so, wie wir es tun, damit es funktioniert und funktioniert.

Dev Anand Sadasivam
quelle
1
Um über Thread zu sprechen, - er wird asynchron erzeugt, obwohl wir möglicherweise synchrone Dinge beim Threading haben. Von Natur aus sind alle Dinge asynchron, obwohl wir Dinge finden, die manchmal synchron sind. Keines der Dinge ist synchron, selbst wenn wir in die Quanten- oder Astronomie eindringen.
Dev Anand Sadasivam