2012-05-31 17 views
8

Quindi sto cercando di lavorare con i thread per un gioco che sto facendo. Sono molto nuovo per l'argomento quindi non posso capire correttamente. La mia domanda è come funziona il metodo currentThread() nella classe Thread dell'API java. L'API dice "Restituisce un riferimento all'attuale oggetto thread in esecuzione.", Ma per quanto comprendo più thread eseguiti contemporaneamente. Come è possibile restituire solo un thread in esecuzione?Current Thread Method java

+0

dovresti leggere alcuni tutorial sul threading. – Sajmon

+2

Penso che avrebbero dovuto chiamarlo getSelfThread() o qualcosa del genere, perché ci può essere più di un thread attualmente in esecuzione con cpus multicore. – goat

risposta

6

Il codice che chiama currentThread verrà eseguito in uno dei thread, non in tutti, in modo che possa ottenere quel thread in modo specifico.

+0

Grazie che lo rende molto più chiaro. – user1427380

4

Quando un'istruzione nel codice viene eseguita, viene eseguita all'interno di un thread specifico. Questo è il thread restituito da quel metodo.

Ovviamente, se un metodo specifico viene eseguito da più thread, ciascuna esecuzione potrebbe restituire un valore diverso per Thread.currentThread().

Si potrebbe provare questo breve esempio per avere una migliore idea di cosa sta succedendo e in particolare il fatto che i 2 thread vengano eseguiti in parallelo. Dovreste vedere che t1 verrà eseguito un paio di ciclo allora t2 farà lo stesso e di nuovo a t1 ecc (potrebbe essere necessario aumentare il numero di cicli da 5 a un numero più alto a seconda della macchina):

public class TestThread { 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       for (int i = 0; i < 5; i++) { 
        System.out.println(Thread.currentThread()); 
       } 
      } 
     }; 

     Thread t1 = new Thread(r, "t1"); 
     Thread t2 = new Thread(r, "t2"); 
     t1.start(); 
     t2.start(); 
    } 
} 
+1

Perché dovresti stampare il thread corrente in un ciclo? Una volta dovrebbe essere sufficiente, penserei. – Jeffrey

+0

Mi piacciono le tue prime 2 frasi ... ma il resto del post, specialmente il codice, sembra abbastanza vago da essere fuorviante. – goat

+0

@Jeffrey l'idea era di mostrare un po 'di interleaving in cui un thread poteva eseguire il ciclo due volte, poi l'altro si attiva ecc. – assylias

0

"Il thread attualmente in esecuzione" indica che lo scheduler di sistema ha dedicato del tempo a questo thread per eseguire il suo codice.

-1

Più thread non sono in esecuzione allo stesso tempo e vi è il cambio di thread tra più thread. Il processore può eseguire un task alla volta in modo da eseguire un thread alla volta. Quindi otteniamo il riferimento del thread attualmente in esecuzione.

+0

Le macchine multicore eseguono più thread contemporaneamente. Ho ottenuto un programma multithreaded (con thread altamente interattivi) lavorando su un singolo core, quindi spostato su una macchina con 4 core. Questa è stata una vera educazione. – RalphChapin

+0

"Più thread non sono _neccessariamente_ in esecuzione contemporaneamente ..." – jdv

4

Supponiamo di avere un elenco di istruzioni stampate su un pezzo di carta. Una persona legge le istruzioni e le esegue. Le istruzioni sono un programma. La persona è un filo. Potresti fare molte copie del foglio e distribuirle a molte persone. Se le istruzioni dicono qualcosa come "schiaffeggiati", te stesso, si riferisce a chiunque stia leggendo le istruzioni di quel documento. Allo stesso modo, Thread.currentThread() si riferisce al thread che sta eseguendo quella chiamata a currentThread().

0

Quando si scrive un'applicazione a thread singolo, è possibile ragionare sul programma come una serie di istruzioni, ciascuna eseguita dopo la precedente (questa è un'approssimazione approssimativa, ma concettualmente compilatore e processore cercano di simularlo e funzionano come se questo fosse davvero ciò che stava accadendo).

Quando si utilizza più thread, ogni thread ha una serie di istruzioni. Un nuovo thread quando viene creato passa un punto di ingresso (un metodo) e continuerà ad essere eseguito da essi. Ogni thread è indipendente dall'altro thread nella loro esecuzione (eseguirà semplicemente una istruzione dopo l'altra), sebbene condividano la memoria e quindi l'effetto collaterale di una discussione possa influire su un'altra.

Quindi, per alcuni codice da eseguire, è necessario farlo nel contesto di un thread (ce n'è uno creato dal sistema operativo all'avvio dell'applicazione, che inizia la sua esecuzione con il metodo Main). Quando viene chiamata la funzione currentThread, si trova in uno di questi contesti.

Il runtime Java durante la creazione di un thread memorizzerà un riferimento a quell'oggetto Thread nel contesto del thread e il currentThread cercherà solo lì e restituirà il thread corrente.

0

In qualsiasi momento, verrà eseguito solo un thread (live), quindi Thread.currentThread() restituisce i dettagli del thread attualmente in esecuzione. ad es. Thread Name, priorità, method_name.