Suspendre et reprendre un thread avec un applet?

stevengren Messages postés 176 Statut Membre -  
KX Messages postés 19031 Statut Modérateur -
Bonjour,

j'aimerais comprendre comment suspendre un thread, pour un temps indéterminé, et ensuite le reprendre et cela à l'aide d'une applet contenant vous l'avez deviner un bouton suspendre et reprendre. J'ai compris comment suspendre mon thread à l'aide de wait() mais sa se complique lorsque je tentes d'utiliser l'applet pour lancer le wait durant l'execution du thread.

Voici le code de mon thread

mon thread écrit simplement le mot test 500 fois dans la console

public class ThreadImpress extends Thread{
public static boolean pause = false;
public ThreadImpress(){

}
public static void pause(){
pause = true;
}
public static void unpause(){
pause = false;
synchronized(Thread.currentThread()){
Thread.currentThread().notify();
}
}

public void run(){
while(true){

try{
for (int i=0;i<500;i++){
if (pause){
synchronized(this){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}
System.out.println("test");
Thread.sleep(30);
}



}
catch(InterruptedException exc){
System.out.println(exc);
}
}
}



public static void main(String[] args){
ThreadImpress th1= new ThreadImpress();
th1.start();
}
}

Et voici le code de mon applet



public class Start extends Applet implements ActionListener{

public static boolean suspend= true;
public void init(){
this.setLayout(new FlowLayout());
JButton b = new JButton("Suprendre");
JButton d = new JButton("Reprendre");
b.addActionListener(this);
b.setActionCommand("b");
d.addActionListener(this);
d.setActionCommand("d");
this.add(b);
this.add(d);
ThreadImpress th1= new ThreadImpress();
th1.start();



}

@Override
public void actionPerformed(ActionEvent arg0) {
if (arg0.getActionCommand().equals("b")){
ThreadImpress.pause();


}
else if(arg0.getActionCommand().equals("d")){

ThreadImpress.unpause();

}
}

Lors de l'execution de mon applet le thread se lance et le bouton suspendre l'arreter mais impossible de reprendre le traitement. Aucune erreur n'est lancer? Biensure j'utilise la commmande notify!

Merci

}



1 réponse

KX Messages postés 19031 Statut Modérateur 3 020
 
C'est compliqué tout ça !

public class ThreadImpress extends Thread
{
    public void run()
    {
        for (int i=0; i<100; i++)
        {
            System.out.println("test "+i);
            try { Thread.sleep(100); } catch (InterruptedException e) {}
        }
    }
}

public class Start extends Applet
{        
    public void init()
    {
        setLayout(new FlowLayout());
        
        final ThreadImpress thread = new ThreadImpress();
    
        JButton suspend = new JButton("Suspendre");
        suspend.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                thread.suspend();
            }
        });
        add(suspend);
        
        JButton resume = new JButton("Reprendre");
        resume.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                thread.resume();
            }
        });
        add(resume);
        
        thread.start();    
    }
}

Remarque : les méthodes suspend(), et resume() sont dépréciées, mais vu ce que tu fais ici ça n'a pas grande importance, tu peux les laisser comme ça. Si tu veux les remplacer quand même, tu peux regarder cet article : Java Thread Primitive Deprecation.
0