IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Bloquer l'execution de la méthode main


Sujet :

Java

  1. #1
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Points : 43
    Points
    43
    Par défaut Bloquer l'execution de la méthode main
    Salut,
    svp, j'ai une petite question concernant les Thread

    j'ai crée un thread t1 qui contient un compteur et il ne sortira de cette boucle que si le compteur à atteint la valeur 100, néanmoins, avant que se thread ne termine il m'execute les autres instructions qui se trouve dans ma classe main alors que je voudrai qu'il ne m'execute que mon thread puis il donne la main aux autre instruction de la classe main.
    voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public class TestThread {
        static Thread t1; 
     
     
    	public static void main(String[] args) {
    		  t1=new Thread(){
    	        	public void run(){
    	        		int i=0;
    	        		while(i<10){
    	        			System.out.println("Thread 1 is running, iteration : "+i);
    	        			i++;
    	        		}
    	        	}	        	
    	        };
    	        t1.start();
    	        System.out.println("MAIN");     
       }
    }
    et je voudrai qu'il m'affiche :

    Thread 1 is running, iteration : 0
    Thread 1 is running, iteration : 1
    ...
    Thread 1 is running, iteration : 9
    Main


    au lieu de

    Thread 1 is running, iteration : 0
    Thread 1 is running, iteration : 1
    ...
    Thread 1 is running, iteration : 9

    Main


    Merci de me dire comment faire

  2. #2
    Membre actif Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Points : 239
    Points
    239
    Par défaut
    Salut,

    Ajoute t1.join(); après t1.start();

    A+
    Hydraland

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Question : quel est l'intérêt de faire un thread dans ce cas là ???
    Pourquoi ne pas exécuté directement le code ???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public static void main(String[] args) {
    	int i=0;
    	while(i<10){
    		System.out.println("iteration : "+i);
    		i++;
    	}
    	System.out.println("MAIN");     
    }
    a++

  4. #4
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Points : 43
    Points
    43
    Par défaut
    Merci hydraland pour ta réponse
    C'est bien ce que j'ai voulu.
    néanmoins, j'ai essayé d'utiliser un objet de type Timer mais ce dernier ne contient pas une méthode join
    Comment faire dans ce cas?
    Merci d'avance

  5. #5
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    Question : quel est l'intérêt de faire un thread dans ce cas là ???
    Pourquoi ne pas exécuté directement le code ???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public static void main(String[] args) {
    	int i=0;
    	while(i<10){
    		System.out.println("iteration : "+i);
    		i++;
    	}
    	System.out.println("MAIN");     
    }
    a++
    Bon je veux utilisé unThread car normalement je vais exécuter une fenetre dans ce thread et en fonction du résultat retourner par ce thread je vais continuer le reste de mon traitement dans la classe main
    Mais j'ai voulu tester tous d'abord mon idée avant d'attaquer le reste
    Merci

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Ganymede Voir le message
    Bon je veux utilisé unThread car normalement je vais exécuter une fenetre dans ce thread et en fonction du résultat retourner par ce thread je vais continuer le reste de mon traitement
    Merci
    Si c'est une interface graphique tu pars dans le mauvais sens... il faudrait partir sur un mode évenementielle.

    Et de toute manière cela ne répond toujours pas à ma question : quel intérêt de faire un nouveau thread si le thread courant est endormis pendant tout ce temps ???


    a++

  7. #7
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Si c'est une interface graphique tu pars dans le mauvais sens... il faudrait partir sur un mode évenementielle.

    Et de toute manière cela ne répond toujours pas à ma question : quel intérêt de faire un nouveau thread si le thread courant est endormis pendant tout ce temps ???


    a++
    Dans ce cas il ne sert à rien mais dans le cas d'utilisation de fenêtre il m'a servit beaucoup car je ne veux pas qu'il exécute le reste de la méthode main avant que l'utilisateur clique un bouton de la fenêtre a développe

  8. #8
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Si c'est une interface graphique tu pars dans le mauvais sens... il faudrait partir sur un mode évenementielle.
    tu peut me donner plus d'info sur le mode évenementielle qui peut m'aider dans mon cas
    Merci d'avance

  9. #9
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Ganymede Voir le message
    Dans ce cas il ne sert à rien mais dans le cas d'utilisation de fenêtre il m'a servit beaucoup car je ne veux pas qu'il exécute le reste de la méthode main avant que l'utilisateur clique un bouton de la fenêtre a développe
    Soit on utilise une boite de dialogue modale (via JOptionPane par exemple), soit dans une interface plus complexe on utilise un système événementielle (actionPerformed() sur un bouton par exemple).


    Mais bon tout cela c'est plutôt lié au développement d'UI qu'aux threads...

    a++

  10. #10
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Soit on utilise une boite de dialogue modale (via JOptionPane par exemple), soit dans une interface plus complexe on utilise un système événementielle (actionPerformed() sur un bouton par exemple).


    Mais bon tout cela c'est plutôt lié au développement d'UI qu'aux threads...

    a++
    Merci adiGuba pour ta réponse.
    Pour l'utilisation des boites de dialogues modales ça ne sert à rien car j'utilise des JInternalFrame et ses derniers auront toujours le focus même si j'ouvre une boite de dialogue modale ou même si je le met toujours en premier plan: setAlwaysOnTop()
    De même lorsque j'utilise un splash screen pour mon application j'ai développe un objet Timer qui implémente la méthode actionPerformer son problème c'est qu'il me réexecute toujours les instruction qui se trouve dans son corps voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
      try {			        	
    	BufferedImage image = ImageIO.read(SplashScreen.class.getResourceAsStream(".\\images\\pos.jpg"));
    			            window = new SplashScreen(image);
    			            window.setVisible(true);			           
    			        } catch (IOException e) {
    			            e.printStackTrace();
    			        }
    Timer timer = new Timer(5000, new ActionListener() {
    		                public void actionPerformed(ActionEvent evt) {
    		                	window.dispose();
    		                	Parameter param=new Parameter();
    		    				DBAccess db=new DBAccess();
    		    				db.setIp(param.getIp());
    		    				db.setPort(param.getPort());
    		    				db.setSid(param.getSid());
    		    				db.setUserNameDB(param.getUserNameDB());
    		    				db.setPwdDB(param.getPwdDB());
    		    				if(db.connect()){
    		    					MainScreen inst = new MainScreen(db);
    		    					inst.setLocationRelativeTo(null);
    		    					inst.setVisible(true);
    		    				}
    		    				else System.out.println("ERROR CONNECTING TO DATA BASE");
    		                }
    		            });
    		            timer.start();
    - l'objet window représente mon splash screen
    - La classe Parameter contient les différentes paramètres de mon application qui sont stocké dans un fichier tq les paramètres d'accès à la bas de données
    - La classe DBAccess permet de se connecté à la base de données
    - La classe MainScreen c'est une JFrame qui constitu mon application principale et qui contient des JInternaFrame.

    Sachant que la classe parameter utilise une autre classe qui affiche un JFrame et qui contient les différentes paramètres dont j'ai besoin et que je vient de dire
    Donc mon but c'est d'afficher mon splash screen window pendant un temps bien déterminé puis je le ferme et j'exécute le reste de mon traitement à partir de l'instruction Parameter param=new Parameter();
    Merci

  11. #11
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Points : 43
    Points
    43
    Par défaut
    et si j'utilise ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    try {			        	
    	BufferedImage image = ImageIO.read(SplashScreen.class.getResourceAsStream(".\\images\\pos.jpg"));
    			            window = new SplashScreen(image);
    			            window.setVisible(true);			           
    			        } catch (IOException e) {
    			            e.printStackTrace();
    			        }
    Timer timer = new Timer(5000, new ActionListener() {
    		                public void actionPerformed(ActionEvent evt) {
    		                	window.dispose();
     
    		                }
    		            });
    		            timer.start(); 
    Parameter param=new Parameter();
    		    				DBAccess db=new DBAccess();
    		    				db.setIp(param.getIp());
    		    				db.setPort(param.getPort());
    		    				db.setSid(param.getSid());
    		    				db.setUserNameDB(param.getUserNameDB());
    		    				db.setPwdDB(param.getPwdDB());
    		    				if(db.connect()){
    		    					MainScreen inst = new MainScreen(db);
    		    					inst.setLocationRelativeTo(null);
    		    					inst.setVisible(true);
    		    				}
    		    				else System.out.println("ERROR CONNECTING TO DATA BASE");
    Alors il m'exécute les instruction à partir de Parameter param=new Parameter(); sans que la fin de l'affichage de mon splash screen se termine

    et si je met mon splash screen dans un thread j'ai ce que je veux mais il ne m'affiche pas l'image qu'il faudra qu'il m'affiche dans mon splash screen c'est bizarre !!!

    voici mon code en utilisant un thread

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    package src;
     
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
     
    import javax.imageio.ImageIO;
    import javax.swing.SwingUtilities;
    import javax.swing.Timer;
     
    import src.gui.MainScreen;
    import src.util.Parameter;
     
    public class Main {
     
    	private static SplashScreen window;
     
     
    	public static void main(String[] args) {
    		SwingUtilities.invokeLater(new Runnable() {
    			public void run() {
     
    				  try {
    			        	File f=new File(".\\images\\pos.jpg");
    			        	if(f.exists()) System.out.println("Exist");
    			        	else System.out.println("Not exist");
    			            BufferedImage image = ImageIO.read(SplashScreen.class.getResourceAsStream(".\\images\\pos.jpg"));
    			            window = new SplashScreen(image);
    			            window.setVisible(true);			           
    			        } catch (IOException e) {
    			            e.printStackTrace();
    			        }
     
    			        Thread t1=new Thread() {
    		                public void run() {
    		                	try {
    								sleep(5000);
    							} catch (InterruptedException e) {
    								// TODO Auto-generated catch block
    								e.printStackTrace();
    							}
    		                	window.dispose();
     
    		                }
    		            };
    		            t1.start(); 
    		            try {
    						t1.join();
    					} catch (InterruptedException e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
    					Parameter param=new Parameter();
        				DBAccess db=new DBAccess();
        				db.setIp(param.getIp());
        				db.setPort(param.getPort());
        				db.setSid(param.getSid());
        				db.setUserNameDB(param.getUserNameDB());
        				db.setPwdDB(param.getPwdDB());
        				if(db.connect()){
        					MainScreen inst = new MainScreen(db);
        					inst.setLocationRelativeTo(null);
        					inst.setVisible(true);
        				}
        				else System.out.println("ERROR CONNECTING TO DATA BASE");			       					        				
    			}
    		});
     
    	}
     
    }

Discussions similaires

  1. paramêtres de la méthode main()
    Par aazize dans le forum C
    Réponses: 1
    Dernier message: 17/12/2006, 10h27
  2. Bloquer un executable
    Par PadawanDuDelphi dans le forum Delphi
    Réponses: 12
    Dernier message: 07/09/2006, 17h03
  3. [JBX] Spécifier la méthode main
    Par fafa139 dans le forum JBuilder
    Réponses: 1
    Dernier message: 15/08/2006, 11h36
  4. Débuts : classe / méthode main
    Par P@t dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 10/07/2004, 03h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo