2010-10-11 9 views
1

Lorsque j'utilise la méthode wait() dans le code suivant son lancer la Exeptionwait et notify problème

Exception in thread "AWT-EventQueue-0" java.lang.IllegalMonitorStateException 

suivant Le code est le suivant:

private void newMenuItemActionPerformed(java.awt.event.ActionEvent evt) {            
     newFileChooser = new JFileChooser(); 

     int returnVal = newFileChooser.showSaveDialog(null); 
     if (returnVal == JFileChooser.APPROVE_OPTION) { 
      filename = newFileChooser.getSelectedFile(); 
      JFrame mainFrame = NetSimApp.getApplication().getMainFrame(); 
      networktype = new NetType(mainFrame); 
      networktype.setLocationRelativeTo(mainFrame); 
      NetSimApp.getApplication().show(networktype); 
      try { 
       this.wait(); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(NetSimView.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      if (!NetType.validip) { 
       statusTextArea.append("File not created:Select Network Type.\n"); 
      } 
      newNodeMenuItem.setEnabled(true); 
     } else { 
      newNodeMenuItem.setEnabled(false); 
      statusTextArea.append("File not created:Access cancelled by user.\n"); 
     } 
    } 

En fait, je fais appel l'objet de une classe jDialog et je veux que l'objet de dialogue devrait d'abord remplir et ensuite il devrait notifier le code donné ci-dessus. J'ai déjà spécifié notify() dans cette classe. Quelqu'un peut-il me dire quel est le problème et sa solution. -Merci à l'avance

Répondre

2

Votre méthode wait doit être incluse dans une méthode synchronized ou un bloc lock, l'objet étant verrouillé sur l'objet que vous souhaitez utiliser.

Dans votre cas, vous devez effectuer la méthode synchronized, ce qui équivaut à appeler lock (this).

1

Vous devez démarrer wait en acquérant la synchronisation sur la variable d'attente, par ex.

synchronized(this) 
{ 
    this.wait(); 
} 

S'il vous plaît lire la javadoc pour wait attentivement et suivre à la lettre, sinon vous serez à de mauvaises surprises.

+0

pour notfy() aussi je dois faire la même chose ?? –

+0

@Harshit. Avez-vous lu javadoc? –

0
  1. bloc synchronisé de code où "wait()" est
  2. ne pas "Notify" Discussion, "notification" runnable, cette discussion est une classe de contrôle pour les enveloppements exécutables et discussion notify/notifyAll/wait avec classe de contrôle
  3. essayez d'utiliser interupt et lancer un "jetable" non-erreur pour suspendre/reprendre thread .
  4. utilisation producent/approche des consommateurs
  5. utilisation fourche/join approche
  6. utilisation de la piscine de fil pour une pause et le fil de reprendre (pause - tuer runnable, CV - Piscine runnable)

Toute de ces approches éliminer votre problème, le problème lui-même est que vous essayez de notifier déjà thread notifié, son même problème, comme le démarrage déjà commencé thread. Il va lancer une exception IllegalMonitorStateException.

Le fil est une solution horriblement écrite pour traiter, mais ce n'est pas si difficile à gérer.

+0

Depuis Janvier je travaille sur la réponse à "Thread problème" Je suis à mi-chemin à travers. Le "problème" est lorsque vous voulez réécrire quelque chose de critique comme Thread, vous devez l'injecter dans JVM dans Runtime (JX16 et classe SecurityManager ne l'accepteraient pas autrement et les classes natives sont signées dans JVM de sorte que vous ne pouvez pas appeler ces classes natives spécifiques sans provoquer d'erreur de sécurité). Mon "Thread" n'a pas besoin de bloc de garde, serrures, sémaphores et moniteurs il utilise WeakReferences Map pour surveiller ses références et son utilisation pas pile comme thread (donc il y a plus de "thread courant" qu'un) ... . –