L'impression de pair et de l'Impair à l'aide de deux Threads en Java
J'ai essayé le code ci-dessous. J'ai pris ce morceau de code à partir d'un autre poste qui est correct comme par l'auteur. Mais quand j'ai essayer de l'exécuter, il ne me donne pas le résultat exact.
C'est principalement pour imprimer des pairs et impairs, les valeurs dans l'ordre.
public class PrintEvenOddTester {
public static void main(String ... args){
Printer print = new Printer(false);
Thread t1 = new Thread(new TaskEvenOdd(print));
Thread t2 = new Thread(new TaskEvenOdd(print));
t1.start();
t2.start();
}
}
class TaskEvenOdd implements Runnable {
int number=1;
Printer print;
TaskEvenOdd(Printer print){
this.print = print;
}
@Override
public void run() {
System.out.println("Run method");
while(number<10){
if(number%2 == 0){
System.out.println("Number is :"+ number);
print.printEven(number);
number+=2;
}
else {
System.out.println("Number is :"+ number);
print.printOdd(number);
number+=2;
}
}
}
}
class Printer {
boolean isOdd;
Printer(boolean isOdd){
this.isOdd = isOdd;
}
synchronized void printEven(int number) {
while(isOdd){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Even:"+number);
isOdd = true;
notifyAll();
}
synchronized void printOdd(int number) {
while(!isOdd){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Odd:"+number);
isOdd = false;
notifyAll();
}
}
Quelqu'un peut-il m'aider à résoudre cela?
MODIFIER
Résultat attendu:
Odd:1
Même:2
Impair:3
Même:4
Odd:5
Même:6
Odd:7
Même:8
Odd:9
Qu'est-ce que le résultat réel et qu'est-ce que le résultat escompté?
numéro commence à 1, et on l'incrémente par 2. Par conséquent, il ne sera jamais même.
Ce n'est pas un service de débogage...
Pour chaque étudiant qui vient ici: parlez-en à votre professeur que bien que cet exercice pourrait vous apprendre quelque chose à propos de comment de contrôle des threads, c'est vraiment horrible exemple de pourquoi d'utiliser des threads. Si vous voulez un programme pour faire certaines choses (par exemple, écrire les nombres) dans un certain ordre (par ex., 1, 2, 3, ...); puis absolument façon de le faire est de faire des choses dans un seul thread. Chaque programme multi-threadé exige synchronisation entre les threads, mais la synchronisation plus vous l'utilisez, le moins d'avantages que vous obtenez de filetage. Ce programme est un négative avantage.
Il n'y a aucune raison pourquoi les fils doivent écrire les nombres en alternance, même en laissant de côté l'erreur à propos de l'incrément. Vos attentes sont égarés, comme c'est le uncited 'un autre morceau de code". Ce n'est pas un service de validation arbitraire indésirable d'Internet.
numéro commence à 1, et on l'incrémente par 2. Par conséquent, il ne sera jamais même.
Ce n'est pas un service de débogage...
Pour chaque étudiant qui vient ici: parlez-en à votre professeur que bien que cet exercice pourrait vous apprendre quelque chose à propos de comment de contrôle des threads, c'est vraiment horrible exemple de pourquoi d'utiliser des threads. Si vous voulez un programme pour faire certaines choses (par exemple, écrire les nombres) dans un certain ordre (par ex., 1, 2, 3, ...); puis absolument façon de le faire est de faire des choses dans un seul thread. Chaque programme multi-threadé exige synchronisation entre les threads, mais la synchronisation plus vous l'utilisez, le moins d'avantages que vous obtenez de filetage. Ce programme est un négative avantage.
Il n'y a aucune raison pourquoi les fils doivent écrire les nombres en alternance, même en laissant de côté l'erreur à propos de l'incrément. Vos attentes sont égarés, comme c'est le uncited 'un autre morceau de code". Ce n'est pas un service de validation arbitraire indésirable d'Internet.
OriginalL'auteur Suvasis | 2013-05-22
Vous devez vous connecter pour publier un commentaire.
Trouvé la solution. Quelqu'un cherche une solution à ce problème peut se référer 🙂
Cela donne de sortie comme:
La réponse n'est pas correcte et ne peut être correct, sans synchronisation ou d'un lock de quelque sorte.
Comment contrôlez-vous que le "Bizarre" thread commence avant le "Même" fil a commencé ? Voulez-vous demander à la "Même" fil de dormir comme il commence ??
OriginalL'auteur Suvasis
Voici le code que j'ai fait ce travail par une seule classe
De sortie:
OriginalL'auteur DeepaGanesh
Utilisez cette très simple de JAVA 8 Classe Runnable fonction
OriginalL'auteur Raj Ved
OriginalL'auteur user2279564
La même chose peut être fait avec l'interface de Verrouillage:
OriginalL'auteur vijayinani
OriginalL'auteur Santosh Kumar
Ce code fonctionne également très bien.
OriginalL'auteur Shailendra
Pensez à ajouter certains d'explications pour votre réponse, pour faire de votre point de clear2.
OriginalL'auteur Amit Sharma
L'autre question a été fermé comme un doublon de celui-ci. Je pense que nous pouvons sans risque de se débarrasser de "pair ou impair" problème et utiliser le
wait/notify
construire comme suit:OriginalL'auteur Kedar Mhaswade
OriginalL'auteur Vicky Malhotra
J'ai fait de cette manière, lors de l'impression à l'aide de deux fils nous est impossible de prédire la séquence thread qui
était exécutée en premier afin de surmonter cette situation, nous avons pour synchroniser la ressource partagée,dans
mon cas, la fonction d'impression de deux threads tentent d'accéder.
OriginalL'auteur shivaitian
C'est ma solution pour le problème. J'ai deux classes de mise en œuvre de
Runnable
, on imprime étrange séquence et l'autre imprime même. J'ai une instance deObject
, que j'utilise pour le verrouiller. J'initialise les deux classes ayant le même objet. Il y a unsynchronized block
à l'intérieur de la méthode run de la classe, où, à l'intérieur d'une boucle, chaque méthode imprime un des numéros de la notifie à l'autre thread, en attente de verrouillage sur le même objet et lui-même attend de même de verrouiller à nouveau.Les classes :
La limite supérieure dans mon exemple est de 10. Une fois l'étrange fil imprime 9 ou le même thread imprime 10, alors nous n'avons pas besoin de les threads pour attendre plus longtemps. Ainsi, nous pouvons répondre que l'utilisation d'un
if-block
. Ou, nous pouvons utiliser la surchargewait(long timeout)
méthode pour l'attendre à être dépassé.Un seul défaut ici. Avec ce code, nous ne pouvons garantir les thread début d'exécution de la première.
OriginalL'auteur de_xtr
Voici le code de travail d'impression étrange même pas sinon à l'aide d'attendre et d'en informer le mécanisme. J'ai restreindre la limite de chiffres à imprimer de 1 à 50.
OriginalL'auteur ProblemSolver
Qui suit est ma mise en œuvre à l'aide de 2 Sémaphores.
Même thread s'exécute imprime 2 et la libération bizarre Sema permettant Bizarre thread à exécuter.
Qui suit est le résultat:-
OriginalL'auteur jaamit
Je pense que les solutions proposées sont inutilement ajouté des trucs et de ne pas utiliser les sémaphores à son plein potentiel. Voici ce que ma solution est.
OriginalL'auteur udit
OriginalL'auteur Sazid Ali
Solution de travail à l'aide de classe unique
OriginalL'auteur Nikhil Kumar K
Vous pouvez utiliser le code suivant pour obtenir la sortie avec la création de deux anonymes fil classes.
OriginalL'auteur Krutik
Cela peut être obtenue à l'aide de Verrouillage et l'État :
OriginalL'auteur Prakash Hari Sharma
De la classe d'impression étrange Même nombre
Programme De Pilote
OriginalL'auteur saurabh goyal
public class Solution {
}
OriginalL'auteur Victor
OriginalL'auteur learner
L'impression étrange et même le nombre par deux Threads peut être fait très facilement. Nous n'avons pas besoin des sémaphores pour cela.Nous avons juste besoin d'une variable statique qui peut être accessible à la fois par les threads . On peut vérifier la valeur de cette variable de référence , si la variable est un nombre pair alors il sera imprimé par le evenThread sinon, il sera imprimé par l'étrange fil. Mais nous devons garder à l'esprit une chose que la variable doit être synchronisé.
OriginalL'auteur saurabh prakash
OriginalL'auteur Akhilesh Singh
OriginalL'auteur rajvineet
Veuillez utiliser le code suivant pour imprimer paires et impaires nombre dans un ordre correct avec les messages souhaités.
OriginalL'auteur Juvenik
Je ne pouvais pas comprendre la plupart des codes qui ont été ici, donc je l'ai écrit moi-même un, peut-être que ça aide quelqu'un comme moi:
REMARQUE: Ce n'utilise pas d'impression séparée pair et de l'impair de la méthode. Une méthode print () - t-il tous les.
OriginalL'auteur Atif Karbelkar
Solution la plus Simple 🙂
OriginalL'auteur farmbytes
OriginalL'auteur Leeladurga Prasad Gunti
Solution Simple ci-dessous:-
OriginalL'auteur Avikool91