2016-01-20 17 views
6

Voglio sapere come e quando un thread si muove avanti e indietro tra gli stati eseguibili e quelli in esecuzione. Cosa succede effettivamente dietro le quinte. Immagino che ciò sia necessario in caso di ThreadPool ma non riesco a capirlo completamente. io per capire questo.In che modo una discussione passa dallo stato di esecuzione a quello di esecuzione?

+1

Perché hai bisogno di sapere? Non lo so neanche io, ma ho usato con successo 'ThreadPool' senza tale conoscenza. –

+0

Mi stavo chiedendo ..... se il thread è in stato di esecuzione che significa il suo metodo run() in esecuzione e quando è in modalità eseguibile il suo metodo start() di esecuzione .... quindi immagino che passare dall'esecuzione a runnable significhi suo tornando da run() a start() .... per favore correggimi se sbaglio dato che sono un principiante del multithreading –

+0

Mi piace questa domanda, e se non è un problema, voto per tenerlo aperto. –

risposta

6

se thread è in stato che indica la sua corsa di esecuzione() e quando la sua nel metodo eseguibile corsa il suo metodo start() in esecuzione .... quindi credo che passare da running a runnable significa tornare da run() a start()

Nella nomenclatura della maggior parte dei sistemi operativi, "in esecuzione" significa che il thread sta eseguendo le istruzioni su alcune CPU e "eseguibile" significa che nulla impedisce al thread di "funzionare", eccetto la disponibilità di una CPU per l'esecuzione.

Un programma Java non può rilevare la differenza tra questi due stati. I thread dichiarano che Java sa sono NUOVI, RUNNABILI, BLOCCATI, ATTENDENTI, TIMED_WAITING e TERMINATI.

Un thread è NUOVO prima che venga chiamato t.start() e che non possa mai tornare a NUOVO in seguito. WAITING e TIMED_WAITING significano entrambi che il thread è in attesa di una chiamata notify() in qualche altro thread. BLOCCATO significa che è in attesa di qualcos'altro (ad esempio, per inserire un blocco synchronized) e TERMINATO significa che è finito.

0

Yield è un metodo statico che indica al thread attualmente in esecuzione di dare una possibilità ai thread che hanno uguale priorità nel Thread Pool.

Non è possibile garantire che Yield esegua immediatamente il thread attualmente in esecuzione nello stato runnable. Ricorda un punto importante che il metodo yield non fa passare il thread allo stato Wait o Blocked. Può solo creare un thread da Running State a Runnable State.

+0

'yield()' viene chiamato raramente, e non è certamente il meccanismo principale al lavoro qui. Non utilizzare la formattazione del codice per il testo che non è codice. – EJP

+0

@Anand ..... grazie per la spiegazione. Solo un altro dubbio .... useremo il rendimento manualmente nel nostro codice ... giusto? In che modo JVM si prende cura di questo da solo? –

+0

* "Non esiste alcuna garanzia che Yield faccia immediatamente il thread attualmente in esecuzione allo stato runnable." * ... Infatti. Sarebbe perfettamente accettabile per una JVM non fare assolutamente nulla quando viene richiamato Thread.yield(). Un programma che dipende dal comportamento di Thread.yield() per la sua correttezza è un programma non-portatile nella migliore delle ipotesi e un programma profondamente errato nel peggiore dei casi. – scottb

0

estratto dalla Guida di un programmatore di Certificazione Java SCJP: Filati:

static yield vuoto() Questo metodo fa sì che il thread corrente per sospendere temporaneamente l'esecuzione e, quindi, consentono di eseguire altri thread. Spetta alla JVM decidere se e quando questa transizione avrà luogo.

vuoto statico sleep (lungo millisec) genera InterruptedException Il thread corrente dorme per il tempo specificato prima che diventi idoneo per la nuova esecuzione.

vuoto finale join() genera InterruptedException vuoto finale unirsi (lungo millisecondi) genera InterruptedException Una chiamata a uno di questi due metodi invocati su un filo aspetterà e non ritorno fino a quando il filo ha completato o è scaduta dopo il tempo specificato, rispettivamente.

void interrupt() Il metodo interrompe il thread su cui è stato richiamato. Negli stati di attesa di notifica, sospensione o bloccato per il completamento del join, il thread riceverà un'interruzione di interruzione.

Sotto L'esempio illustra le transizioni tra stati di filo. Un thread su (1) dorme un po 'a (2) e quindi esegue un calcolo in un ciclo a (3), dopo il quale il thread termina. Il metodo main() monitora il thread in un ciclo su (4), stampando lo stato del thread restituito dal metodo getState(). L'output mostra che il thread passa attraverso lo stato RUNNABLE quando il metodo run() inizia ad essere eseguito e quindi passa allo stato TIMED_WAITING per andare a dormire. Al risveglio, calcola il ciclo nello stato RUNNABLE e passa allo stato TERMINATO quando termina il metodo run().

Esempio: filetto membri

public class ThreadStates { 

    private static Thread t1 = new Thread("T1") { // (1) 
    public void run() { 
     try { 
     sleep(2);         // (2) 
     for(int i = 10000; i > 0; i--);   // (3) 
     } catch (InterruptedException ie){ 
     ie.printStackTrace(); 
     } 
    } 
    }; 

    public static void main(String[] args) { 
    t1.start(); 
    while(true) {         // (4) 
     Thread.State state = t1.getState(); 
     System.out.println(state); 
     if (state == Thread.State.TERMINATED) break; 
    } 
    } 
} 

uscita possibile dal programma:

RUNNABLE 
TIMED_WAITING 
... 
TIMED_WAITING 
RUNNABLE 
... 
RUNNABLE 
TERMINATED