2009-10-21 9 views
2
consécutives

Salutations,threads en Java

Je suis en train de résoudre la tâche suivante: Compte tenu de N fils, les faire courir consécutivement. Par exemple chacun d'eux devrait afficher son numéro dans l'ordre suivant:

Ficelle 1 2 ... Discussion N

Comment ce que je fais, en utilisant seulement attendre/notify et méthodes synchronisées (sans drapeaux, etc.)?

P.S. Désolé pour mon pauvre anglais :)

+2

Est-ce un problème de devoirs? Si non, pourquoi voudriez-vous utiliser des threads pour cela? –

+0

println est beaucoup plus rapide lorsqu'il est utilisé simultanément :) ... ressemble à des devoirs cependant. – Esko

+0

semble que vous voulez mettre en œuvre un planificateur round robin –

Répondre

3

Que diriez-vous:

thread1.run(); 
thread2.run(); 
thread3.run(); 

threads nouveaux ne sont pas nécessaires à moins que l'exécution simultanée est nécessaire. Un seul thread peut exécuter les corps des threads de manière consécutive.

Si cette approche simple ne fonctionne pas (c'est-à-dire, satisfaire les attentes d'un enseignant pour un exercice de devoirs artificiel), s'il vous plaît clarifier le problème dans votre question.

+0

Ce faisant, il n'est pas garanti qu'il imprimera "Thread 1, Thread 2, Thread 3" –

+0

@ (Alexander Pogrebnyak) Oui, il le fera. – NawaMan

+2

Alexander, il appelle .run(), pas .start() :) – Grandpa

0

En pseudo-code, il ressemblerait à ceci:

synchronized (var) 
{ 
    var.wait(); 
    print(var); 
    var.notifyAll(); 
} 
0

Je suppose que vous ne pouvez pas modifier chaque code de fil. Tellement ici est

... 
final Thread[] Threads = ...; 
Thread aSuperThread = new Thread() { 
    public void run() { 
     for(Threads T : Threads) 
      T.run(); 
    } 
}; 
aSuperThread.start(); 
... 
1

Avez-vous essayé joining les discussions?

Je ne fournirai pas plus d'indices, car c'est un devoir.

7
thread1.start(); 
thread1.join(); 

thread2.start(); 
thread2.join(); 

... 

L'appel à .join() attendra que le thread se termine avant de continuer.

+0

+1, mais vous voulez probablement une boucle plutôt que thread1/thread2 etc :-) –

0

Avez-vous entendu parler de Executors?

// create ExecutorService to manage threads       
ExecutorService threadExecutor = Executors.newFixedThreadPool(3); 
threadExecutor.execute(task1); // start task1 
threadExecutor.execute(task2); // start task2 
threadExecutor.execute(task3); // start task3 

Où tâche1, tâche2 et tâche3 sont des objets qui implémentent l'interface exécutable. Les exécuteurs sont disponibles depuis Java 5 Plus d'info: http://www.deitel.com/articles/java_tutorials/20051126/JavaMultithreading_Tutorial_Part4.html

Questions connexes