Lancer un traitement à partir d'un autre
Résolu
manoulaa7
Messages postés
4
Statut
Membre
-
manoulaa7 Messages postés 4 Statut Membre -
manoulaa7 Messages postés 4 Statut Membre -
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.
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.
A voir également:
- Lancer un traitement à partir d'un autre
- Creer un groupe whatsapp a partir d'un autre groupe - Guide
- Reconsidérer le traitement de vos informations à des fins publicitaires - Accueil - Réseaux sociaux
- Comment faire une recherche à partir d'une photo - Guide
- Traitement de texte gratuit - Guide
- Lancer un programme au démarrage windows 10 - Guide
4 réponses
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.
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.
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
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
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()
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();
}
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