46 votes

Exemple de thread Java ?

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.

77voto

Phil Points 1959

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.

8voto

Tim Bender Points 11611

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.

4voto

Sahil Jain Points 11
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();
}

}

0voto

abd alkojok Points 1

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X