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 :

[ Runnable - 2 appli. java] start, stop, resume, suspend


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 114
    Par défaut [ Runnable - 2 appli. java] start, stop, resume, suspend
    Bonjour,

    Salut à tous
    J'ai une application java qui lance un thread.
    Mon thread implemente Runnable.

    voici son 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
    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    public class MonRunner implements Runnable {
     
    	private volatile boolean isStopped;
    	private volatile boolean isSuspended;
    	private volatile boolean isStarted;
     
    	private volatile Thread currentThread;
     
    	public MonRunner() {
     
    	}
     
     
    	/**
             * Exécute la tâche courante
             */
    	public void run() {
     
    		try {
    			this.currentThread = Thread.currentThread();
     
    			// waiting started
    			this.waitStarted();
     
    			while (!this.isStopped){
    				try {
    					...
    					this.waitSupended();
    				}
    				catch(Exception e) {
    ...
    				}
    				finally {
    					this.waitInterval();
    				}
    			}
    		}
    		catch (InterruptedException e) {
    			Thread.currentThread().interrupt();
    		}
    		catch (Exception e){
    ...
    		}
    		finally {
    this.currentThread = null;
    		}
    	}
     
    	/**
             * Attend selon le délai définit dans le fichier de configuration "tasks-reception.xml"
             */
    	private void waitInterval() {
    		try {
    			Thread.sleep(this.activeTask.getInterval());
    		}
    		catch (InterruptedException e) {...
    		}
    	}
     
    	public synchronized void start() {
    		if(this.isStarted) {
    			this.isStopped = false;
    		}else{
    			this.isStarted = true;
    			this.currentThread = new Thread(this, this.getName());
    			this.currentThread.start();
    		}
    	}
     
    	/**
             * Arrête la tâche courante
             */
    	public synchronized void stop() {
    		this.currentThread = new Thread(this, this.getName());
     
    		this.isStopped = true;
    		if (this.currentThread != null) {
    			this.currentThread.interrupt();
    		}
    		//System.exit(0);
    	}
     
    	public synchronized void suspend() {
    		this.isSuspended = true;
    	}
     
    	public synchronized void resume(){
    		this.isSuspended = false;
    	}
     
    	private void waitSupended() throws InterruptedException {
    		while (this.isSuspended) {
    			Thread.sleep(200);
    		}
    	}
     
    	private void waitStarted() throws InterruptedException {
    		while (this.isStarted && this.isStopped) {
    			Thread.sleep(200);
    		}
    		this.isStarted = false;
    	}
    Je lance une première fois mon application avec le param start.
    Il appel la methode start(); l'attribut "currentThread" est bien instancié.
    le thread demarre correctement

    Je lance une seconde fois mon application avec le param stop.
    cela appale la methode stop.
    Mon probleme c'est que je recupere la bonne reference de l'objet MonRunner mais l'attribut "currentThread" est null ???

    2 questions :
    Les 2 applis partagent bien le meme espace mémoire ?
    Les threads ne sont pas partagés entre applications tournant dans la meme JVM ?

  2. #2
    Membre expérimenté
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Par défaut bug sur le stop
    Tu crée un nouveau Thread dans le stop, alors qu'il faut utiliser la même instance de Thread et la stopper.

    Sinon question style, utiliser des sleep pour synchronizer, ça pique les yeux... utilise un wait(timeout) à la place, et rajoute un notify dans les méthodes suspend et resume.

    edit: oops mal lu, je pense que tu a rajouté le new pour débugger, mais ça ne fonctionneras pas:

    1. Les 2 applications ne partagent pas le même espace mémoire.
    2. Pour faire communiquer 2 applications il faut utiliser un mécanisme de communication: EJB sur un serveur d'appli, ou rmi, ou encore Socket....

    c'est Le socket qui est plus simple sur une simple appli: ta première appli écoute indéfiniment sur un port déterminé. La seconde envoi une commande d'arret

    Sinon, pourquoi as-tu besoin de 2 JVM ? (ça complique ). tu ne pouvais pas rester dans la même JVM?

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 114
    Par défaut
    J'ai modifié la portion de code par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.currentThread = Thread.currentThread();
    .
    Malheureusement, le currentThread de l'application start n'a pas la meme reference que l'application stop.

    Je suis d'accord avec toi pour récupérer la même instance de thread,
    c'est l'objet de mon post

    Plus simplement, est ce possible en lançant le programme deux fois de suite,
    que les 2 instances partagent des références et des threads ????

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par gladek Voir le message
    Plus simplement, est ce possible en lançant le programme deux fois de suite, que les 2 instances partagent des références et des threads ????
    Non. Tu dois procéder autrement pour faire communiquer deux applications.
    Ou alors tu fais du RMI, ça t'évites de gérer la partie communication.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

Discussions similaires

  1. Java Service Wrapper et start-stop-deamon
    Par ruddy32 dans le forum JOnAS
    Réponses: 1
    Dernier message: 29/11/2009, 22h13
  2. [Stratégie]Appli java --> Applet
    Par alamihamza dans le forum Applets
    Réponses: 6
    Dernier message: 31/03/2005, 11h40
  3. [MAC] Lancement d'appli java
    Par zakir dans le forum Général Java
    Réponses: 3
    Dernier message: 15/03/2005, 10h01
  4. [Plugin][Débutant] Lancement d'une appli Java avec un plugin
    Par antares24 dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 29/07/2004, 14h18
  5. [Executable] Executer une appli java facilement
    Par legend666 dans le forum Général Java
    Réponses: 7
    Dernier message: 13/06/2004, 12h21

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