0

J'ai référencé this previous question ainsi que d'autres sources, mais ne peut pas faire fonctionner CountDownLatch correctement. Arrière-plan: mainFrame crée un nouveau cadre appelé dataEntryFrame. Lorsque le bouton "Soumettre" de dataEntryFrame est cliqué, l'enregistrement ajouté à la base de données et dataEntryFrame est éliminé. MainFrame devrait effacer et recharger un jList qui affiche tous les enregistrements. Problème: Lorsque dataEntryFrame se charge, java se bloque, les composants dataEntryFrame ne se chargent jamais. Je ne peux pas dépasser cette partie ... puis, dans DataEntryFrame, CountDownLatch ne devrait être décrémenté qu'après avoir cliqué sur le bouton Soumettre, ajouter avec succès un enregistrement à une table de base de données et se disposer lui-même. Ou quand l'utilisateur clique annuler ...Java CountDownLatch utilisé pour jeter JFrame

code: De MainFrame

clearList(); 
CountDownLatch dataEntryDone = new CountDownLatch(1); 
DataEntryFrame f = new DataEntryFrame(dataEntryDone); 
Thread newThread = new Thread(f); 
newThread.start(); 
dataEntryDone.await(); 
reLoadList(); 

code: De DataEntryFrame

public void run(){ 
initComponents(); 
loadOtherData(); 
this.setVisible(true); 
} 
void submit(){ 
addRecord(); 
this.dispose() 
dataEntryDone.countDown(); 
} 
+2

Il n'y a pas assez d'informations pour dire à coup sûr, mais il semble que mainFrame a le fil de distribution d'événements verrouillé quand il attend le loquet. Pendant ce temps, votre code DataEntryFrame s'exécute en dehors du thread d'envoi d'événement Swing, ce qui est incorrect pour les objets Swing/AWT. Fournir plus de code serait utile. –

Répondre

2

Utilisation d'un nouveau thread pour le dataEntryFrame et le blocage de la mainFrame aller contre la Modèle de filetage Swing. Dans Swing, tous les appels aux composants de l'interface utilisateur dans Swing doivent avoir lieu sur le thread de répartition des événements. Pour vérifier que cela se produit pendant le développement, vous pouvez installer un gestionnaire de repaint qui lève une exception s'il détecte que les composants de l'interface utilisateur sont utilisés à partir d'un autre thread. Voir FEST - Testing that access to GUI components is done in the EDT. Pour vous assurer que quelque chose se passe sur l'EDT, vous utilisez SwingUtilities.invokeAndWait/invokeLater.

Votre trame principale ne doit pas (et ne devrait pas!) Attendre le cadre de saisie de données, au lieu de CountDownLatch, votre cadre de saisie de données déclenche un événement vers le MainFrame quand c'est fait, de sorte que le MainFrame peut prendre les mesures appropriées, telles que l'actualisation de la liste.

Pour boucher les choses encore plus loin, enregistrer les données dans la base de données et récupérer les données pour la liste devrait idéalement être effectué sur le fil d'expédition de l'événement. Au lieu de cela, utilisez un SwingWorker pour effectuer ces opérations dans leur propre thread. Cependant, contrairement à la règle selon laquelle tous les composants de l'interface utilisateur doivent être accessibles à partir de l'EDT, cette règle de traitement en arrière-plan n'est pas stricte, mais il est recommandé de maintenir une interface utilisateur réactive - si le transfert de données prend du temps et C'est fait sur le thread de l'interface utilisateur (EDT), l'interface utilisateur va se bloquer.

Voir

+0

Merci pour les mots utiles, mdma et Noel. J'ai commencé à regarder dans l'EDT et Swing Worker après la demande de Noel pour plus de code. SwingWorker semble être la voie à suivre contre CountDownLatch. Vous avez raison de dire que les requêtes de base de données pourraient être faites de la même façon ... Je ne vois pas de coup de performance maintenant mais à plus grande échelle je suis sûr que cela pourrait arriver. Je l'ai trouvé aussi, ce qui peut être utile: http://java.sun.com/docs/books/tutorial/uiswing/concurrency/dispatch.html javax.swing.SwingUtilities.isEventDispatchThread() – Brian

+0

Maintenant que j'y pense, c'était un cas de savoir maintenant ce que je ne savais pas ... alors merci encore. – Brian

+0

Votre bienvenue. Il n'est pas surprenant que vous l'ayez manqué - le premier java obtient une boîte à outils graphique multithread - l'AWT, et plus tard ceci est étendu à Swing, sans le support multi-thread. – mdma