Java - Zugriff auf statische Methode Schlaf - Was ist los?

7

Wenn ich den folgenden Code in NetBeans einfüge, gibt NetBeans eine Warnung mit dem Hinweis "Zugriff auf den Schlafmodus der statischen Methode" aus.

%Vor%

Mache ich etwas falsch? Soll ich das anders nennen? Ich mache nichts Multithread. Ich habe nur eine einfache Hauptmethode, die ich für eine Weile schlafen möchte.

    
Greg 09.08.2010, 13:12
quelle

6 Antworten

10

Thread.currentThread () gibt eine Instanz der Thread-Klasse zurück. Wenn Sie eine statische Methode aufrufen, möchten Sie nur an der Klasse selbst arbeiten. Wenn Sie eine statische Methode für den aktuellen Thread aufrufen, erhalten Sie eine Warnung, dass Sie die Methode für eine Instanz aufrufen.

Sie würden einfach Thread.sleep(2000); aufrufen. Das wäre äquivalent zu Thread.currentThread.sleep(2000);

Dies ist wichtig zu wissen, weil Leute verbrannt wurden, die etwas wie:

machen %Vor%

Edit: Also, wie schlafen wir? Sie schlafen a, indem Sie den Schlafaufruf innerhalb des runnable schreiben, der an den Konstruktor übergeben wird, wie:

%Vor%

Wenn 'a' gestartet wird, ist Thread.currentThread in der Run-Methode von someRunnable die Thread-Instanz 'a'.

    
John Vint 09.08.2010, 13:17
quelle
6

sleep ist statisch, daher greifen Sie mit Thread.sleep(2000); darauf zu. Es wirkt sich auf den aktuellen Thread aus.

Aus dem Javadoc:

  

Bewirkt den aktuell ausgeführten Thread   schlafen (die Ausführung vorübergehend einstellen)   für die angegebene Anzahl von   Millisekunden. Der Thread verliert nicht   Besitz von Monitoren.

Was das bedeutet ist, dass Sie nicht einen anderen Thread schlafen können, nur den, in dem sich der Code befindet.

    
Paul Tomblin 09.08.2010 13:15
quelle
2

Das liegt daran, dass die Methode sleep () daher als statisch deklariert ist

%Vor%

ist dasselbe wie

%Vor%     
stacker 09.08.2010 13:15
quelle
2

Es gibt keine Methode für Thread-Instanzen, die "sleep (long)" entspricht.

Thread.currentThread () .Sleep (2000); kompiliert jedoch, weil es eine Methode für die Thread-Klasse gibt, die sleep () mit einem langen Argument genannt wird.

Java erlaubt dies als einen Compiler-Zeittrick, so dass neue Programmierer dies ausführen können, wenn sie über den statischen Zugriff von Methoden verwirrt sind.

Was jedoch im Compiler tatsächlich gelöst ist, ist:

Thread.sleep (2000);

Der folgende Code ist ebenfalls äquivalent:

Thread t = neuer Thread (new Runnable () {public void run () {// tue nichts}}); t.Schlaf (2000);

Wie ein Poster (John V) gezeigt hat, lässt dies die tatsächliche Thread (t) -Instanz nicht schlafen - der aktuelle Thread, der das Thread-Objekt erstellt hat, wird in den Ruhezustand versetzt.

Die Warnung existiert so, dass Sie sich erinnern, dass Sie auf eine statische Methode einer Klasse und nicht auf eine Methode einer Instanzvariablen zugreifen.

Der richtige Code zum Schreiben ist immer Thread.sleep (2000); - greifen Sie niemals auf statische Methoden über eine Instanz zu, um Verwirrung und diese Warnung zu vermeiden.

    
MetroidFan2002 09.08.2010 13:26
quelle
1

netbeans gibt Ihnen eine Warnung, weil Sie von Threadreferenz nicht auf Thread-Klasse zugreifen. probiere das

aus %Vor%

sleep-Methode Veranlasst, dass der aktuell ausgeführte Thread in den Ruhezustand versetzt wird. So müssen Sie Thread.currentThread () nicht aufrufen.

    
Vivart 09.08.2010 13:18
quelle
1

Immer wenn Sie versuchen, auf die statische Methode mit dem Objekt zuzugreifen, ist es nicht die beste Übung, NB gibt zu dieser Zeit eine Warnung, hier ist der gleiche Fall

Thread.currentThread () wird Ihnen ein Objekt von Thread

zurückgeben     
Jigar Joshi 09.08.2010 13:21
quelle