3 votes

Comment arrêter, mettre en pause, annuler un thread en java

Je développe une application en java qui lance des threads qui effectuent des tâches et mettent à jour une base de données. JTable avec un JProgressBar . Je développe un JPopupMenu sur le JTable qui a des JMenuItem :

  • Pause
  • Stop
  • Annuler
  • Curriculum vitae

Je veux donc être capable de le faire.

Lorsque l'utilisateur ajoute un nouveau fil dans JTable je sauvegarde le fil dans un ArrayList<Thread> donc je dois mettre en place

stop.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {

            }
        });

et l'autre

J'essaie donc, avec l'hypothèse que j'ai l'index du fil actuel :

Thread t = working.get(selectedThread); //where working is my `ArrayList<Thread>`
t.interrupt();

mais rien... il continue à fonctionner... alors j'ai essayé :

try {
                        working.get(actualRow).wait();
                    } catch (InterruptedException ex) {
                        Logger.getLogger(PannelloRicerca.class.getName()).log(Level.SEVERE, null, ex);
                    }

mais il m'a eu IllegalStateMonitorException en wait() Je ne sais donc pas comment faire. Quelqu'un peut-il m'aider ?

2voto

Gray Points 58585

El Thread.interrupt() ne fait qu'activer le bit d'interruption sur le Thread et cela cause tout wait o sleep appels à lancer InterruptedException . Il n'annule pas l'exécution du fil comme beaucoup s'y attendent.

Vous pouvez tester le bit d'interruption dans un fil comme celui-ci :

while (!Thread.currentThread().isInterrupted()) {
   ...
}

Une façon typique pour les gens d'arrêter un fil est d'avoir une icône de type AtomicBoolean (ou volatile boolean ) et faire quelque chose comme :

AtomicBoolean running = new AtomicBoolean(true);
while (running.set()) {
    ...
}

...
// then in the other thread (like the main thread) you stop the thread by:
runner.set(false);

Vous obtenez le IllegalStateMonitorException parce que vous appelez wait sans être à l'intérieur d'un synchronized pour l'objet que vous attendez. Vous devez faire quelque chose comme :

Thread t = working.get(actualRow);
synchronized (t) {
    t.wait();
}

Bien que je ne sois pas sûr que ce soit ce que vous voulez. Peut-être voulez-vous vous joindre au fil qui attend qu'il se termine ?

   working.get(actualRow).join();

1voto

SJuan76 Points 16867

El IllegalStateMonitorException c'est parce qu'un thread ne peut attendre dans un objet que s'il le "possède" (je ne me souviens pas si c'est le bon terme).

Vous devez d'abord synchroniser par le même objet, afin de vous assurer que personne d'autre n'attend déjà sur cet objet.

 synchronize (working.get(actualRow)) {
   working.get(actualRow).wait(); 
 }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X