2009-02-25 6 views
1

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.

+0

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

+0

Vous devez montrer comment vous démarrez ces threads. – Clint

+0

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

Répondre

0

Comme vous pouvez le voir, ils ne fonctionneront pas sans synchronisation, fixer ainsi que le premier.

3

Comment sont deux instances différentes de deux classes différentes partageant la variable quit? Essayez d'utiliser un AtomicBoolean, partagé entre vos deux threads.

Aussi, comment savez-vous que le fil de balayage bloque l'autre? À partir de votre code, je ne peux pas les voir partager des ressources à l'exception de la variable quit.

Peut-être que vous voyez le « fil a commencé » message et vous ne voyez pas le message « dormir » pendant un certain temps parce que le receiveThread est coincé dans la méthode handler.receive() ...

+0

J'ai essayé de le laisser pendant un moment et il ne fait rien, j'ai aussi des messages provenant de handler.recieve(). Peu importe combien de temps je le quitte, entrer deux lignes dans la fenêtre provoque le démarrage de handler.recieve. – user70835

+0

votre quitThread n'a pas de message "thread started", vous ne savez donc pas vraiment s'il a bien démarré. Peut-être que votre programme est coincé dans le premier nextLine, avant de démarrer les threads. – Chochos

0

Ressemble son rapport avec bug 4206767

+0

Selon le texte de ce bogue, c'est seulement un problème lors de l'utilisation de la VM classique et "Green Threads" et pas de threads natifs. – Eddie

Questions connexes