web-dev-qa-db-fra.com

Exemple de thread Java?

Quelqu'un pourrait-il donner un exemple de programme qui explique les threads Java de manière simple? Par exemple, disons que j'ai trois threads t1, t2 et t3. Je veux un code qui montre que les threads s'exécutent simultanément et non de manière séquentielle.

45
JavaUser

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();
   }
}

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);
      }
   }
}

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 objet MyThread essaie d’imprimer des nombres compris entre 0 et 300, mais il n’est responsable que de certaines régions de cette plage. J'ai choisi de le scinder en index, chaque thread sautant en avant du nombre total de threads. Donc, t1 fait les index 0, 3, 6, 9, etc.

Maintenant, sans IO, des calculs triviaux comme celui-ci peuvent toujours ressembler aux threads qui s'exécutent de manière séquentielle, c'est pourquoi je viens de montrer la première partie du résultat. Sur mon ordinateur, une fois que ce fil de sortie portant l'ID 10 s'est terminé en une seule fois, suivi de 9, puis de 8. Si vous avez mis une attente ou un rendement, vous pourrez mieux le voir:

MyThread.Java

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

Et la sortie:

[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 thread en train de s'exécuter, en abandonnant le contrôle plus tôt et le prochain en cours d'exécution.

77
Phil

Rien ne garantit que vos discussions s'exécutent simultanément, quel que soit l'exemple trivial publié par une autre personne. Si votre système d'exploitation ne fournit qu'un seul processus au processus de traitement Java, vos threads Java seront toujours planifiés pour chaque tranche de temps en mode tour à tour. Cela signifie que deux personnes ne pourront jamais exécuter simultanément, mais leur travail sera imbriqué. Vous pouvez utiliser des outils de surveillance tels que Visual VM (standard dans le JDK) de Java pour observer les threads s'exécutant dans un processus Java.

8
Tim Bender

Un exemple simple:

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

créer une application Java dans laquelle vous définissez deux threads, à savoir t1 et t2, le thread t1 générera les nombres aléatoires 0 et 1 (simuler le tirage au sort). 0 signifie tête et un signifie queue. l'autre thread t2 fera de même t1 et t2 répétera cette boucle 100 fois. Enfin, votre application devra déterminer combien de fois t1 devine le nombre généré par t2 et affichera le score. par exemple, si le thread t1 devine 20 nombre sur 100, alors le score de t1 est 20/100 = 0.2 si t1 devine 100 nombres, il obtient le score 1, etc.

0
abd alkojok