Lancer un traitement à partir d'un autre

Résolu/Fermé
manoulaa7 Messages postés 4 Date d'inscription jeudi 20 décembre 2012 Statut Membre Dernière intervention 20 décembre 2012 - 20 déc. 2012 à 02:56
manoulaa7 Messages postés 4 Date d'inscription jeudi 20 décembre 2012 Statut Membre Dernière intervention 20 décembre 2012 - 20 déc. 2012 à 17:04
Bonsoir,
Mon problème est le suivant :
au cours d'un traitement lancer par une jframe, j'ai besoin dans un cas particulier ouvrir une deuxième jframe, réaliser un traitement au sein d'elle puis récupérer le résultat dans un vecteur, la fermer, et continuer mon premier traitement.

4 réponses

manoulaa7 Messages postés 4 Date d'inscription jeudi 20 décembre 2012 Statut Membre Dernière intervention 20 décembre 2012 2
20 déc. 2012 à 16:16
Salut,
J'ai un traitement dans un bouton, au cours de ce traitement il y a un appel à un nouveau thread. Mon problème est : comment arrêter le premier traitement pour que le thread puisse se lancer et le reprendre une fois le thread a terminé son traitement.
1
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié par KX le 20/12/2012 à 16:54
Voici un exemple très simple :

public static void main(String[] args)
{
    final Thread thread1 = new Thread()
    {
        public void run()
        {
            for (int i=0;;i++)
            {
                System.out.println("Thread_1 = "+i);
                try { Thread.sleep(1); } catch (InterruptedException e) {}
            }
        }
    };
    
    final JFrame frame1 = new JFrame();
    JButton button1 = new JButton("pause");
    
    button1.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent ae)
        {
            frame1.setEnabled(false);
            thread1.suspend();
            
            final Thread thread2 = new Thread()
            {                
                @Override
                public void run()
                {
                    for (int j=0;;j++)
                    {
                        System.out.println("Thread_2 = "+j);
                        try { Thread.sleep(1); } catch (InterruptedException e) {}
                    }
                }
            };            
            
            final JFrame frame2 = new JFrame();
            
            JButton button2 = new JButton("continue");
            button2.addActionListener(new ActionListener()
            {
                @Override
                public void actionPerformed(ActionEvent ae)
                {
                    thread2.stop();
                    frame2.dispose();
                    
                    frame1.setEnabled(true);
                    thread1.resume();
                }
            });
            
            frame2.add(button2);
            frame2.setBounds(200,0,100,100); 
            
            frame2.setVisible(true);
            thread2.start();
        }
    });
    
    frame1.add(button1);
    frame1.setBounds(0,0,100,100); 
    frame1.setVisible(true);
    thread1.start();
    
    frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

Remarque : les méthodes suspend() et resume() sont dépréciées. Dans mon exemple leur utilisation ne pose aucun problème, mais dans un programme qui manipule plus intensivement les Thread il vaudrait mieux ne pas s'en servir.
Voir : Java Thread Primitive Deprecation
0
manoulaa7 Messages postés 4 Date d'inscription jeudi 20 décembre 2012 Statut Membre Dernière intervention 20 décembre 2012 2
20 déc. 2012 à 16:40
Voici ma classe Test qui contient le traitement principal :

public class Test {
static Vector v=new Vector();
public static void init() throws Exception{

//Initialisation du premier mot avec son annotation
if(!v.isEmpty()){
casinit("ATB1.xml");
}
else {
Runnable tache = new MonRunnable ();
Thread monThread = new Thread ( tache );
monThread . start ();
// la méthode creation necessite des données récuperées à partir du thread : monThread
creation(v);

}
}
}

Et la classe MonRunnable qui imlémente le traitement du thread :

public class MonRunnable implements Runnable {
public void run () { go (); }
public void go () {

AnnotationSystemManel.jFrame2.setVisible(true);
}
}

Le problème est que le traitement de la méthode creation se lance avant que le thread termine son traitement
1
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
20 déc. 2012 à 16:56
Il ne s'agit alors plus vraiment d'arrêter le premier thread, mais plutôt d'attendre qu'il se termine !
Dans ce cas c'est encore plus simple avec la méthode join()

public static void main(String[] args) throws InterruptedException
{
    final Thread thread1 = new Thread()
    {
        public void run()
        {
            for (int i=0;i<10;i++)
            {
                System.out.println("Thread_1 = "+i);
                try { Thread.sleep(500); } catch (InterruptedException e) {}
            }
        }
    };
    
    final Thread thread2 = new Thread()
    {                
        @Override
        public void run()
        {
            for (int j=0;j<10;j++)
            {
                System.out.println("Thread_2 = "+j);
                try { Thread.sleep(500); } catch (InterruptedException e) {}
            }
        }
    };  
    
    thread1.start();
    thread1.join();
    thread2.start();
}
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
20 déc. 2012 à 12:57
Et alors ?
0
manoulaa7 Messages postés 4 Date d'inscription jeudi 20 décembre 2012 Statut Membre Dernière intervention 20 décembre 2012 2
20 déc. 2012 à 17:04
Merci bien, je veux l'adapter à mon code.
0