2010-03-28 20 views
44

Qualcuno potrebbe fornire un programma di esempio che spiega le discussioni Java in modo semplice? Ad esempio, supponiamo di avere tre thread t1, t2 e t3. Voglio un codice che dimostri che i thread vengano eseguiti simultaneamente, e non in modo sequenziale.Esempio di thread Java?

+3

Quindi, qual è esattamente la tua domanda? In questo momento sembra solo "dammi codice" e non lo facciamo ... per non parlare, anche in quel caso non sono sicuro di cosa debba fare questo codice che sembra vogliate. –

+1

Giusto per capire la programmazione concorrente con l'esempio pratico David. – JavaUser

+0

Ho preso la tua domanda nel senso che volevi un esempio per dimostrare che i thread fanno quello che dicono che faranno, visivamente. Spero che la mia risposta aiuti, nonostante l'output di ogni thread sia tutt'altro che pratico. – Phil

risposta

74

Ecco un semplice esempio:

ThreadTest.java

public class ThreadTest 
{ 
    public static void main(String [] args) 
    { 
     MyThread t1 = new MyThread(0, 3, 300); 
     MyThread t2 = new MyThread(1, 3, 300); 
     MyThread t3 = new MyThread(2, 3, 300); 

     t1.start(); 
     t2.start(); 
     t3.start(); 
    } 
} 

MyThread.java

public class MyThread extends Thread 
{ 
    private int startIdx, nThreads, maxIdx; 

    public MyThread(int s, int n, int m) 
    { 
     this.startIdx = s; 
     this.nThreads = n; 
     this.maxIdx = m; 
    } 

    @Override 
    public void run() 
    { 
     for(int i = this.startIdx; i < this.maxIdx; i += this.nThreads) 
     { 
     System.out.println("[ID " + this.getId() + "] " + i); 
     } 
    } 
} 

E alcuni di uscita:

[ID 9] 1 
[ID 10] 2 
[ID 8] 0 
[ID 10] 5 
[ID 9] 4 
[ID 10] 8 
[ID 8] 3 
[ID 10] 11 
[ID 10] 14 
[ID 10] 17 
[ID 10] 20 
[ID 10] 23 

Una spiegazione: ogni oggetto MyThread tenta di stampare numeri da 0 a 300, ma sono responsabili solo per determinate regioni di tale intervallo. Ho scelto di dividerlo per indici, con ogni thread che salta avanti per il numero di thread totali. Così t1 fa indice 0, 3, 6, 9, ecc

Ora, senza IO, calcoli banali come questo può ancora guardare come fili sono in esecuzione in sequenza, ecco perché ho mostrato la prima parte dell'output . Sul mio computer, dopo questa discussione in uscita con ID 10 finiture tutto in una volta, seguito da 9, allora 8. Se si mette in un'attesa o una resa, si può vedere meglio:

MyThread.java

System.out.println("[ID " + this.getId() + "] " + i); 
Thread.yield(); 

e l'output:

[ID 8] 0 
[ID 9] 1 
[ID 10] 2 
[ID 8] 3 
[ID 9] 4 
[ID 8] 6 
[ID 10] 5 
[ID 9] 7 

ora si può vedere ogni thread di esecuzione, rinunciare al controllo precoce, e la prossima esecuzione.

+1

Thx Phil .. davvero bella risposta che mi aspetto esattamente. – JavaUser

7

Non esiste alcuna garanzia che i thread vengano eseguiti contemporaneamente, indipendentemente da qualsiasi esempio banale di altri post. Se il tuo sistema operativo solo dà al processo Java un processore su cui lavorare, i tuoi thread java saranno comunque programmati per ogni intervallo di tempo in modo round robin. Ciò significa che non verranno mai eseguiti due simultaneamente, ma il lavoro che svolgeranno sarà interfogliato. È possibile utilizzare strumenti di monitoraggio come Visual VM di Java (standard nel JDK) per osservare i thread in esecuzione in un processo Java.

+1

Tim, sembra che sia una vera domanda. Il PO ha detto che voleva solo un esempio pratico (sicuro che l'OP potesse google, ma non è necessariamente una domanda non valida). – Kiril

+4

Penso che quello che volevo dire è che non è davvero una domanda nel senso che non si adatta a un formato di domande e risposte. Invece richiede codice di esempio. Indipendentemente da ciò, era abrasivo, quindi ho modificato la mia risposta, che è ancora tecnicamente corretta. Non c'è modo di dimostrare in modo definitivo l'esecuzione simultanea. Anche la risposta accettata dimostra solo l'interleaving. –

3

Un semplice esempio:

public class Test extends Thread { 
    public synchronized void run() { 
     for (int i = 0; i <= 10; i++) { 
      System.out.println("i::"+i); 
     } 
    } 

    public static void main(String[] args) { 
     Test obj = new Test(); 

     Thread t1 = new Thread(obj); 
     Thread t2 = new Thread(obj); 
     Thread t3 = new Thread(obj); 

     t1.start(); 
     t2.start(); 
     t3.start(); 
    } 
} 
0

crea un'applicazione java in cui definire due fili cioè T1 e T2, filo t1 genererà numero casuale 0 e 1 (simulare lanciare una moneta). 0 significa testa e uno significa coda. l'altro thread t2 farà lo stesso t1 e t2 ripeterà questo ciclo 100 volte e infine l'applicazione dovrebbe determinare quante volte t1 indovina il numero generato da t2 e quindi visualizza il punteggio. per esempio se thread t1 indovina 20 numeri su 100 allora il punteggio di t1 è 20/100 = 0.2 se t1 indovina 100 numeri allora ottiene punteggio 1 e così via