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

Concurrence et multi-thread Java Discussion :

ExecutorService / Thread périodique


Sujet :

Concurrence et multi-thread Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 26
    Par défaut ExecutorService / Thread périodique
    Bonjour,

    je cherche à exécuter un traitement long dans un thread simple, et à la fin de son exécution mettre à jour l'état d'un bouton de l'interface. A côté de cela, j'ai besoin d'un thread périodique qui permet de mettre à jour l'interface pour afficher un log du traitement lancé dans le précédent thread.

    Pour cela, j'ai une pile de message partagé par les 2 threads, mais je cherche à savoir / comprendre comment utiliser les ExecutorService pour faire tout cela.

    Est il possible d’exécuter un newSingleThreadExecutor et un newSingleThreadScheduledExecutor dans le même ExecutionService et de gérer ensuite facilement les interactions avec l'interface, de les stopper en cours de route si nécessaire etc.... ???

    Si qqun a un lien d'un exemple concret je suis preneuse.

    Merci.

  2. #2
    Membre averti
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 26
    Par défaut
    Il n'est pas possible de faire un pool du même type, j'ai donc tenté de faire un pool de fixedThreadPool(5) et un pool de ScheduledThreadPool(5).

    Les Runnable s'exécutent (et doivent activer un event sur un eventlistener à leur fin d'exécution), mais malheureusement dès que celui qui est périodique (toutes les secondes) prend la main il ne la rend jamais et donc mon process principal ne se poursuit pas.

    Qqun aurait il une idée ?

    Voici un petit bout d'exemple de 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
     
    public void launch(){
        ...
        AsyncTask = new task1();
        AsyncThreadPool.submit(task1);
     
        ...
        AsyncTask = new task2();
        AsyncScheduledThreadPool.submit(task2);
    }
     
    public void onAsyncTask1(Event event) {
        processFinished();
    }
     
    public void onAsyncTask2(Event event) {
        updateUi();
    }
    Dès que la task 2 s'exécute, j'ai l'event onAsyncTask2 qui s'exécute en boucle....

    Merci par avance.

  3. #3
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 1
    Par défaut
    Bonjour,

    Pour récupérer le résultat d'un calcul quand il est terminé tu peux utiliser les Future<V>.

    Par exemple :

    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
    final ExecutorService pool = Executors.newSingleThreadExecutor();
     
    Future<Integer> future = pool.submit(new Callable<Integer>() {
     
    	@Override
    	public Integer call() throws Exception {
     
    			//Attente de 5 secondes pour simuler une action longue
    			Thread.sleep(TimeUnit.SECONDS.toMillis(5));
     
    			return 10;
    		}
    	});
    System.out.println("On reprend la main après avoir soumis la tâche.");
     
    try {
    	System.out.println("Quand le resultat est prêt on le récupère : " + future.get());
    } 
    catch (InterruptedException e) {
    	//Le thread a été intérrompu
    	e.printStackTrace();
    } 
    catch (ExecutionException e) {
    	//Le code dans call a levé une exception.
    	e.printStackTrace();
    }
    pool.shutdown();
    Pour ce qui est des actions périodiques, un exemple d'utilisation de ScheduledExecutorService:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    final ScheduledExecutorService scheduledPool = Executors.newSingleThreadScheduledExecutor();
     
    scheduledPool.scheduleWithFixedDelay(new Runnable(){
     
    	@Override
    	public void run() {
    		System.out.println("Message affiché toutes les 2 secondes.");
     
    	}
     
    }, 0, 2, TimeUnit.SECONDS);
     
     
    System.out.println("On continu l'exécution pendant que la tâche périodique s'exécute");

    Voila, j'espère t'avoir aidé.

Discussions similaires

  1. Comment rendre un thread périodique
    Par jalber11 dans le forum C
    Réponses: 4
    Dernier message: 31/07/2012, 17h12
  2. pool de thread ideal avec ExecutorService(java 5)
    Par 461219 dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 11/02/2008, 09h53
  3. Actualisation périodique : timer ou thread ?
    Par Shredder dans le forum Langage
    Réponses: 12
    Dernier message: 02/11/2007, 08h52
  4. Réponses: 1
    Dernier message: 09/08/2006, 16h04
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

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