J'ai 2 fils, qui est polling une boîte aux lettres pour les messages puis dormir while (!quit)
et un autre qui est censé changer le drapeau quit
doit entrer l'utilisateur 'Q'
. Il semble que le thread d'analyse bloque l'exécution de l'autre thread jusqu'à ce qu'il y ait une entrée (généralement 2 lignes). J'ai essayé de changer la priorité des Threads et l'ordre dans lequel ils commencent, en vain.Comment puis-je empêcher mes threads de se bloquer les uns les autres?
class quitThread extends Thread {
public void run() {
char c;
Scanner scanner = new Scanner(System.in);
do {
c = scanner.nextLine().toUpperCase().charAt(0);
} while (c != 'Q');
quit = true;
}
}
class recieveThread extends Thread {
public void run() {
System.out.println("thread started");
while (!quit) {
try {
MailHandler handler = new MailHandler();
handler.recieve();
System.out.println("Sleeping");
sleep(_sleepinterval);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Je sais que je dois à vous soucier de mutex et la synchronisation, mais je veux les discussions sur au moins le travail avant que je commence inquiéter. EDIT: Voici comment je commence les discussions:
void go() throws Exception{
char c;
System.out.println("S or R");
Scanner s = new Scanner(System.in);
c = s.nextLine().toUpperCase().charAt(0);
MailHandler handler = new MailHandler();
QuitThread q = new QuitThread();
q.setPriority(java.lang.Thread.MIN_PRIORITY);
RecieveThread rc = new RecieveThread();
rc.setPriority(java.lang.Thread.MAX_PRIORITY);
switch (c){
case 'S':
handler.send("[email protected]ah.net", "hello there");
break;
case 'R':
rc.start();
q.start();
break;
default :
break;
}
}
Note: les priorités ne sont pas à l'origine là, il est quelque chose que je viens d'essayer et il ne fait aucune différence.
Il n'y a aucun problème évident dans l'extrait de code. Il n'y a pas assez d'informations pour déduire la cause du problème. – McDowell
Vous devez montrer comment vous démarrez ces threads. – Clint
J'espère que "quitter" est défini pour être volatile. Vous avez vraiment besoin de vous soucier de la synchronisation maintenant. Cela pourrait faire partie de votre problème. De plus, en Java, les noms de classes devraient commencer par une majuscule. – Eddie