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?
risposta
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.
Thx Phil .. davvero bella risposta che mi aspetto esattamente. – JavaUser
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.
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
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. –
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();
}
}
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
- 1. Esempio di bitSet Java
- 2. Esempio di deadlock del thread in C#
- 3. java array thread-safety
- 4. Pool di thread in Java
- 5. Overhead creazione di thread Java
- 6. Ora di inizio thread Java
- 7. domanda su "Java Concurrency in Practice" esempio
- 8. Esempio di pool di thread dinamici in boost :: asio
- 9. Posso eseguire un thread all'interno di un thread in java?
- 10. C# equivalente di Java esempio di inizializzazione
- 11. esempio di utilizzo di scala.collection.immutable.Set da java
- 12. Esempio di un metodo di istanza? (Java)
- 13. Thread verde e thread nativi in java
- 14. Un buon esempio di concorrenza di Java vs Clojure
- 15. Thread daemon Java
- 16. Thread Java "sincronizzati"
- 17. thread state java
- 18. Affinità thread Java
- 19. RejectedExecutionException in thread Java
- 20. Timer in Java Thread
- 21. Java XPathFactory thread-safety
- 22. System.exit in Java Thread
- 23. Java: RandomAccessFile thread-safe
- 24. Current Thread Method java
- 25. Blocco thread Java
- 26. Come pianificare thread Java
- 27. thread parcheggiato Java
- 28. eccezioni java thread
- 29. C++ compile std: esempio di thread con scons
- 30. Akka Java FSM per esempio
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. –
Giusto per capire la programmazione concorrente con l'esempio pratico David. – JavaUser
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