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

Langage Java Discussion :

Reproduire mécanisme de SwingUtilities.invokeLater()


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut Reproduire mécanisme de SwingUtilities.invokeLater()
    Salut,

    Je souhaiterais reproduire le mécanisme de SwingUtilities.invokeLater(), c'est-à-dire avoir une file (FIFO) de Runnable qui s'exécutent les uns à la suite des autres dans un Thread séparé (mais bien sûr différent de l'EDT, contrairement à SwingUtilities.invokeLater()).
    Et de préférence, quelque chose déjà présent dans l'API ^^ :-)

    Vers quel classe dois-je m'orienter?

    Merci d'avance :-)

  2. #2
    Membre Expert
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Par défaut
    Tu peux utiliser la nouvelle api intégré à java 5, à savoir java.util.concurrent
    Elle te permettra de créer un pool de thread (ou même un seul thread ) le plus facilement du monde.
    Je pourrais t'aider d'avantage si tu détailles un peu plus ce que tu souhaite faire.


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  3. #3
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Merci de ta réponse, je vais regarder de ce côté là...

    Ce que je souhaite faire:
    J'ai une liste (de 113 éléments actuellement), et un composant de recherche en dessous, qui fait office de filtre de la liste...
    Dès qu'on modifie le texte du composant de recherche, la liste est filtrée (c'est une liste de chaîne, si dans la recherche il y a un numéro ou un bout de nom de chaîne, par exemple "France", alors les chaînes "France 2", "France 3", "France ô"... s'afficheront dans la liste).
    Bon, en fait là ça marche bien, mais le problème c'est que l'algorithme de filtrage est effectué dans l'EDT, et si je souhaite le complexifier un peu, ça risque de freezer quelques millisecondes
    Donc je pourrais lancer un Thread et mettre à jour la liste dans ce Thread par SwingUtilities.invokeLater(), mais si on écrit très vite dans le composant de recherche, ça lance plusieurs Threads en simultané et on ne sait pas dans quel ordre ils vont se terminer (ça sera peut-être la première requête exécutée en dernier).
    C'est pour ça que je voudrais lancer ces Threads les uns après les autres (ou un seul Thread qui exécute les actions les unes après les autres).

    Là c'est pour mon exemple actuel, mais j'aurai besoin exactement de la même chose pour une récupération de données dans une db par la suite (pour exécuter les requêtes les unes après les autres si plusieurs sont demandées en mm tps)...

  4. #4
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    D'après le package que tu m'as indiqué, je pense qu'il faut utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Executors.newSingleThreadExecutor()
    pour récupérer un ExecutorService...

    Mais ensuite ?

    Et quelle est la différence entre Callable et Runnable ?

    EDIT:
    Ah peut-être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ExecutorService pool = Executors.newSingleThreadExecutor();
    pool.execute(myRunnable);
    ?

  5. #5
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Je sais pas ce que vaut mon idée, mais tu peut aussi faire tout simplement un thread qui a comme attiribut une arrayList de Thread ou de Runnable et qui les éxécute les uns après les autres en attendant chaque fois la fin du précédent. Dès qu'il en a plus, il attend (listener ?) qu'un autre thread soit ajouté et l'éxécute.

  6. #6
    Membre Expert
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Par défaut
    Ok, j'ai bien compris maintenant. En fait ce que tu cherches à faire c'est une file avec un unique thread qui exécuterait les tâches dans la file les une après les autres (corrige moi si je me trompe ).
    Dans ce cas, il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ExecutorService executeurDeTache=Executors.newSingleThreadExecutor();
    //lancement des taches
    executeur.execute(monRunnable1);
    executeur.execute(monRunnable2);
    ...
    Si tu as besoin de plus de threads,regarde du coté de Executor qui fournit plein de méthodes statiques.


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  7. #7
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par afrikha
    Ok, j'ai bien compris maintenant. En fait ce que tu cherches à faire c'est une file avec un unique thread qui exécuterait les tâches dans la file les une après les autres (corrige moi si je me trompe ).
    Dans ce cas, il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ExecutorService executeurDeTache=Executors.newSingleThreadExecutor();
    //lancement des taches
    executeur.execute(monRunnable1);
    executeur.execute(monRunnable2);
    ...
    Si tu as besoin de plus de threads,regarde du coté de Executor qui fournit plein de méthodes statiques.
    OK merci, c'est nickel :-)

    Bien pratique :-)

    On se demande comment certains peuvent se passer de java 1.5 :-)

  8. #8
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Et encore une petite question...

    Pour la liste des chaînes, j'ai essayé ça c'est nickel...

    Maintenant, pour l'accès à la base de données, je voudrais faire quasiment pareil, sauf que je voudrais que seule la dernière demande de requête soit exécutée...
    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    |  A  |  B  |     C     | D |   E   |
    -------->
    A B C D E sont 5 requêtes, la flèche indique où en est le Thread (au milieu du B).
    Donc là par exemple, il a exécuté A, il est en train d'exécuter B, et je veux que le prochain soit E (qu'il mette à la poubelle C et D), car par exemple si je demande de chercher qqch, puis encore autre chose, je peux abandonner l'ancienne recherche...

    Je pense qu'il y a une solution simple dans l'API, mais je ne sais pas où :-)

    Merci d'avance

Discussions similaires

  1. thread volatile SwingUtilities.invokeLater()
    Par gilles81 dans le forum Concurrence et multi-thread
    Réponses: 0
    Dernier message: 19/08/2009, 18h55
  2. Ne break plus après SwingUtilities.invokeLater()
    Par Julien Bodin dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 07/08/2009, 13h10
  3. Retour valeur SwingUtilities.invokeLater
    Par SebastianPx dans le forum EDT/SwingWorker
    Réponses: 8
    Dernier message: 30/03/2009, 12h02
  4. SwingUtilities.invokeLater : à quoi ça sert ?
    Par ANOVA dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 16/12/2007, 19h10
  5. SwingUtilities.invokeLater casse mon redimensionnment
    Par Baptiste Wicht dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 01/06/2007, 10h42

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