J'utilise plusieurs threads dans mon application. Fondamentalement, j'ai une zone de liste déroulante et lors de la sélection de la boîte de réception, p1 reprend et p2 est suspendu et lors de la sélection de Envoyer, p2 démarre et p1 s'arrête. Voici le code (je suis sûr que ce n'est pas parfait)Problème de threads Java
public void modifyText(ModifyEvent e) {
if (combo.getText().equals("Inbox"))
{
synchronized(p2)
{
p2.cont = false;
}
table.removeAll();
synchronized(p1)
{
p1.cont = true;
p1.notify();
}
}
else if (combo.getText().equals("Sent"))
{
synchronized(p2)
{
p1.cont = false;
}
table.removeAll();
synchronized(p1)
{
p2.cont = true;
p2.notify();
}
}
}
});
et pour P1 et P2 ont ce que je l'intérieur de leur boucle while:
synchronized (this) {
while (cont == false)
try {
wait();
} catch (Exception e) {
}
}
... Comme il est il travaille maintenant (Je suis un débutant aux discussions). En appuyant sur Envoyé dans la zone de liste déroulante, j'obtiens une exception IllegalStateMonitorException. Quelqu'un pourrait-il m'aider à résoudre le problème plz?
Merci et salutations, Krt_Malta
Il n'attend pas dans le thread AWT. Il appelle juste notify(). De plus, je vous recommande d'appeler notifyAll() pour vous assurer que le thread en attente est averti. –
En utilisant synchronisé n'importe où dans l'EDT qui peut provoquer une attente. N'est-ce pas vrai? – Pyrolistical
Voilà à quoi servent les verrous gardés; leur verrou recule jusqu'à une demi-serrure en attendant. Cela permet à un autre thread de saisir le verrou puis de reprendre l'autre thread. De toute façon, si vous utilisez notify() ou wait(), vous devez * avoir * un verrou sur l'objet. Voir http://www.java2s.com/Code/Java/Threads/Threadnotify.htm pour plus de détails. –