Lancer un traitement à partir d'un autre

Résolu
manoulaa7 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention   -  
manoulaa7 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Membre Dernière intervention   2
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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   Statut Membre Dernière intervention   2
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Et alors ?
0
manoulaa7 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention   2
 
Merci bien, je veux l'adapter à mon code.
0