Bonjour,

Mon application a 2 Thread majeur :
- Le GUI
- Le Thread qui s'occupe des transferts de données réseaux

A un moment la personne appuiera sur un bouton pour faire une demande de données et donc si je ne fais rien, le Thread GUI essaie de récupérer la variable trop vite et donc récupère du null.
Ma question est la suivante :
Quelle est la meilleure solution pour faire qu'un Thread attende sur un autre ?
J'ai essayé sleep, marche très bien mais je ne peux pas savoir le nombre de temps que le transfert va prendre donc c'est un peu hasardeux.
J'ai essayé wait mais il me met une erreur sûrement dû à la synchronisation des Thread.
Que me conseillez-vous de faire ?

Exception in thread "AWT-EventQueue-0" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at unoclient.viewTable.loadingList(viewTable.java:57)
at unoclient.viewTable.jButtonRefreshActionPerformed(viewTable.java:205)
at unoclient.viewTable.access$000(viewTable.java:25)
at unoclient.viewTable$2.actionPerformed(viewTable.java:187)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6263)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6028)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public void  loadingList() throws InterruptedException, IOException{
        this.client.getData().wait();    <---------- Erreur
        jButtonRefresh.setEnabled(false);
        DefaultTableModel model = new DefaultTableModel(
                new Object[4][],
            new String [] {
                "Name", "Type", "Slots", "Room leader"
            });
 
        jLabelTable.setText("Loading...");
        jTableGamesList.setModel(model);
        jLabelGamesFound.setText("Searching for games.");
        this.client.getData().notify();
        Thread.currentThread().wait();
        getNetwork().writeObject(new cmdToServer().playerRefreshTables(getPlayer()));
        setGames(this.client.getGames());
Thread.currentThread().notify();
 
    }
Cordialement,

rXp>!<