Quelqu'un pourrait-il donner un exemple de programme qui explique les Java Threads de manière simple ? Par exemple, disons que j'ai trois threads t1
, t2
et t3
. Je veux un code qui démontre que les threads s'exécutent simultanément, et non séquentiellement.
Réponses
Trop de publicités?Voici un exemple simple :
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();
}
}
MonFilière.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);
}
}
}
Et quelques sorties :
[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
Une explication - Chaque MyThread
essaie d'imprimer les nombres de 0 à 300, mais il n'est responsable que de certaines régions de cette plage. J'ai choisi de la diviser par indices, chaque thread sautant en avant du nombre total de threads. Donc t1
fait l'index 0, 3, 6, 9, etc.
Maintenant, sans IO, des calculs triviaux comme celui-ci peuvent toujours regardez comme les threads s'exécutent séquentiellement, c'est pourquoi je n'ai montré que la première partie de la sortie. Sur mon ordinateur, après cette sortie, le thread avec l'ID 10 se termine en une seule fois, suivi de 9, puis de 8. Si vous mettez un wait ou un yield, vous pouvez mieux le voir :
MonFilière.java
System.out.println("[ID " + this.getId() + "] " + i);
Thread.yield();
Et le résultat :
[ID 8] 0
[ID 9] 1
[ID 10] 2
[ID 8] 3
[ID 9] 4
[ID 8] 6
[ID 10] 5
[ID 9] 7
Vous pouvez maintenant voir chaque fil s'exécuter, abandonner le contrôle prématurément, et le suivant s'exécuter.
Il n'y a aucune garantie que vos threads s'exécutent simultanément, quel que soit l'exemple trivial que quelqu'un d'autre publie. Si votre système d'exploitation ne donne au processus Java qu'un seul processeur sur lequel travailler, vos threads Java seront toujours programmés pour chaque tranche de temps de manière circulaire. En d'autres termes, il n'y en aura jamais deux qui s'exécuteront simultanément, mais le travail qu'ils effectueront sera entrelacé. Vous pouvez utiliser des outils de surveillance comme Visual VM de Java (standard dans le JDK) pour observer les threads qui s'exécutent dans un processus Java.
A simple example:
Entrez le code ici
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();
}
}
Créez une application java dans laquelle vous définissez deux threads, à savoir t1 et t2, le thread t1 générera des nombres aléatoires 0 et 1 (simulant le lancer d'une pièce de monnaie). 0 signifie tête et 1 signifie queue. l'autre thread t2 fera la même chose t1 et t2 répéteront cette boucle 100 fois et finalement votre application devrait déterminer combien de fois t1 devine le nombre généré par t2 et ensuite afficher le score. par exemple si le thread t1 devine 20 nombres sur 100 alors le score de t1 est 20/100 =0.2 si t1 devine 100 nombres alors il obtient le score 1 et ainsi de suite