L'impression de “Bonjour” et “monde” à plusieurs reprises à l'aide de deux threads en java
Supposons qu'un thread affiche "Bonjour" et une autre " imprime "Monde". Je l'ai fait avec succès pour une fois, comme suit:
package threading;
public class InterThread {
public static void main(String[] args) {
MyThread mt=new MyThread();
mt.start();
synchronized(mt){
System.out.println("Hello");
try {
mt.wait();
i++;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class MyThread extends Thread{
public void run(){
synchronized(this){
System.out.println("World!");
notify();
}
}
}
Comment puis-je faire pour plusieurs temps de l'impression, disons 5 fois? J'ai essayé de mettre de la boucle autour de la synchronisation de bloc, mais d'aucune utilité.
- Peut-être vous devriez penser à deux boucles.
- Peut-être vous devriez penser à utiliser CyclicBarrier.
- Ce n'est pas garanti pour toujours imprimer Bonjour tout le Monde! - le thread principal peut être interrompu entre mt.start(); et synchronisée(mt)
Vous devez vous connecter pour publier un commentaire.
Ici deux interdépendants fils, nous avons besoin de deux synchronisation d'objets. ils pourraient être l'un des beaucoup de choses. un nombre entier, un autre objet; un Boolean un autre objet; objet; les deux sémaphores et ainsi de suite. la technique de synchronisation peut être soit du Moniteur ou du Sémaphore de la manière que vous voulez, mais ils doivent être deux.
J'ai modifié votre code pour utiliser un sémaphore au lieu de Surveiller. Le Sémaphore de travaux de manière plus transparente. Vous pouvez voir l'acquérir et de la libération qui se passe. Les moniteurs sont même plus des constructions. Donc Synchronisé fonctionne sous le capot.
Si vous êtes à l'aise avec le code suivant, puis vous pouvez le convertir utiliser des Moniteurs de la place.
Le but ici est de synchroniser les threads de sorte que lorsque l'on a fait notifier à l'autre. Si j'ai à le faire, il serait de 2 threads s'exécutant le même code avec des données différentes. Chaque thread dispose de ses propres données (
"Hello"
ettrue
à T1,"World"
etfalse
à t2), et de partager une variableturn
plus distincte de verrouillage de l'objet.Avant de commencer à essayer de le faire fonctionner, cinq fois vous avez besoin pour vous assurer qu'il fonctionne une fois!
Votre code n'est pas garanti pour toujours imprimer Bonjour tout le Monde! - le thread principal peut être interrompu avant de prendre le verrou de mt (à noter que le verrouillage sur le thread des objets est généralement pas une bonne idée).
Une approche qui permettra de généraliser à faire à de nombreuses reprises, est d'utiliser un atomique boolean
C'est dans C:
Il y a deux fil et deux possède ses propres données ("Bonjour" et fidèle à ht, "le Monde" et la valeur false pour wt), et de partager une variable objturn.
De façon simple, nous pouvons le faire à l'aide de
wait()
etnotify()
sans la création de tout objet supplémentaire.