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


86

Ho questo nel mio codice

Thread.currentThread().sleep(x);

Eclipse mi dice di usare lo statico

Thread.sleep(x); 

invece, perché? Qual è la differenza, c'è qualche differenza di funzionalità tra questi 2 metodi?


1
c'è una 'azione di salvataggio' in Eclipse che sostituirà automaticamente l'accesso ai membri statici tramite variabili di istanza con accesso statico tramite il nome della classe: abilita questa azione di salvataggio e tutte le altre azioni di salvataggio con cui sei d'accordo (ad esempio, rimuovi cast non necessari, non necessari 'questo', ecc.).
les2

Risposte:


136

C'è un solo metodo, non due, ed è statico. Sebbene sia possibile chiamare un metodo statico tramite un riferimento all'istanza, non è un buon stile. Indica che il programmatore pensa di chiamare un metodo di istanza. Un programmatore confuso potrebbe pensare di poter far dormire un altro thread (non quello attuale) in questo modo, quando non è quello che fa.

Entrambe le righe di codice fanno la stessa cosa, ma la seconda è uno stile migliore.


25
+1 per menzionare che il programmatore potrebbe voler far dormire un particolare thread tramite someThread.sleep (), cosa che non fa.
Chii

32

In Java, il sonno è un metodo statico. Entrambi i tuoi esempi fanno esattamente la stessa cosa, ma la versione precedente crea confusione perché sembra che stia chiamando un metodo su un oggetto specifico ma non lo sta facendo affatto. Nel tuo esempio non avrà molta importanza, ma è più pericoloso se hai quanto segue:

someOtherThread.sleep(x);

Questa volta sembra che tu stia dicendo a qualche altro thread di dormire, ma in realtà stai mettendo il thread corrente a dormire. Il modo per evitare di commettere questo tipo di errore è chiamare sempre metodi statici utilizzando la classe anziché un oggetto specifico.


Vuoi dire che sia currentThread che someOtherThread andranno in sospensione durante l'esecuzione di questa singola riga "someOtherThread.sleep (x);" ??
Kanagavelu Sugumar

3
No. Il thread corrente andrà in sospensione, indipendentemente dall'oggetto Thread .sleep viene chiamato. Non puoi mettere altri Thread a dormire (così).
Coppia

3

Le due chiamate al metodo sono identiche nel comportamento perché invocano lo stesso metodo ma l'utilizzo del nome della classe ( Thread in questo caso) piuttosto che dell'istanza per accedere a campi e metodi statici rende chiara questa staticità. Ecco perché viene prodotto questo avviso.

Ma considerando che i campi e i metodi statici sono mostrati in modo particolare nella maggior parte degli IDE (ad esempio in corsivo in Eclipse e IntelliJ IDEA), questo avvertimento è ancora necessario? Forse non tanto necessario quanto lo era nei primi giorni di Java che erano in uso semplici editor.


0

Thread.currentThread().sleep(x);o il modo in cui Eclipse dice che il Thread.sleep(x);contesto statico è richiesto se è necessario, quindi tratteniamo un leggero ritardo con questo sonno.

Il paradigma statico impostato da un oggetto, influenza solo quel particolare ciclo di vita di stampa dell'heap di oggetti, ancora una volta considerando che il ciclo di vita dell'oggetto complessivo statico non è così fastidioso, se necessario può essere utilizzato per facilitare la codifica, ma deve essere fatto con attenzione come piede statico. print è indicato da Class(ad esempio: - Class.forName(pkg.className)) come simile al nome e non da qualsiasi altra objectcopia stampata in fase di esecuzione di Class in HEAPmemoria.

Anche in questo caso l'uso di un oggetto ha pro e contro per i riferimenti Debole, Fantasma, Forte ...,

Il codice è contorto dalla natura. È solo il modo in cui lo facciamo per farlo funzionare e funzionale.


1
Per parlare di thread, - viene generato in modo asincrono, sebbene potremmo avere cose sincrone nel threading. Per natura le cose, tutte le cose sono asincrone, anche se a volte troviamo cose che sono sincrone. Nessuna delle cose è sincrona, anche se intromettiamo il Quantum o l'astronomia.
Dev Anand Sadasivam
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.