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 :

Multithreading - 2 tâches


Sujet :

Langage Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Points : 34
    Points
    34
    Par défaut Multithreading - 2 tâches
    Bonjour,
    J'ai une méthode ,composée de 2 tâches T1 et T2 avec la condition suivante:Un thread peut exécuter T1 uniquement si aucun autre thread n'est entrain d'exécuter T2.
    pourriez-vous m'indiquer comment coder cela?

  2. #2
    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,


    Il faut synchroniser les deux tâches avec le même lock.


    a++

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Points : 34
    Points
    34
    Par défaut
    Il faudrait que les threads puissent continuer à exécuter simultanément la tache2
    exemple :Si je fais ce qui est indiqué ci-dessous ,cela ne sera plus possible

    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
    package Test;
     
    public class Class1 {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		Thread thread1 = new Thread(new Class2(), "thread1");
    		Thread thread2 = new Thread(new Class2(), "thread2");
    		Thread thread3 = new Thread(new Class2(), "thread3");
    		Thread thread4 = new Thread(new Class2(), "thread4");
    		Thread thread5 = new Thread(new Class2(), "thread5");
    		Thread thread6 = new Thread(new Class2(), "thread6");
    		Thread thread7 = new Thread(new Class2(), "thread7");
    		thread1.start();
    		thread2.start();
    		thread3.start();
    		thread4.start();
    		thread5.start();
    		thread6.start();
    		thread7.start();
    	}
     
    }
    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
    package Test;
     
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
     
     
    public class Class2 implements Runnable {
     
    	private static final Lock lock = new ReentrantLock();
    	private static volatile Integer count = 0;
     
    	@Override
    	public void run() {
    		String threadName = Thread.currentThread().getName();
    		System.out.println("=================== BEGIN "+threadName+" ===================");
     
            try {
                lock.lock();
                count++;
                if(count==2 || count ==5){
                    for(int j=0;j<100;j++){
                   	 System.out.println("======>"+threadName+" task1 "+j);
                    }
                }
             } finally {
                lock.unlock();
             }
     
             try {
                 lock.lock();
                 for(int i=0;i<100;i++){
                	 System.out.println("===========>"+threadName+" task2 "+i);
                 }
              } finally {
                 lock.unlock();
              }
      		System.out.println("=================== END "+threadName+" ===================");
    	}
    }

  4. #4
    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 Casshern Voir le message
    Il faudrait que les threads puissent continuer à exécuter simultanément la tache2
    Peut-être avec un ReadWriteLock... mais il faudrait avoir plus de détail sur tes tâches et le comportement global que tu souhaite avoir...

    a++

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Points : 34
    Points
    34
    Par défaut
    Salut,
    les threads sont lancés à la demande par des utilisateurs U1 U2 U3 U4...
    tache1:
    Appel à une procédure PL\SQL P1:truncate table T1 + INSERT d'enregistrements dans T1.
    On by-passe l'exécution de la tache1 si celle-ci a été exécutée il y a moins de SS secondes.
    tache2:
    Appel à une procédure PL\SQL P2:DELETE dans la table T2 d'enregistrements relatifs à l'utilisateur Ux + INSERT dans T2 de données relatives à l'utilisateur Ux ,récupérées à partir de données présentes dans T1
    On refuse à Ux le lancement de la tache2 si la tache2 est déjà en cours d'exécution pour ce même utilisateur Ux.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Points : 34
    Points
    34
    Par défaut
    Casshern remercie adiGuba
    Je regarderai de plus près ce package java.util.concurrent.locks

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Multithread et liste de tâches
    Par GoustiFruit dans le forum Langage
    Réponses: 6
    Dernier message: 15/10/2011, 13h42
  2. barre de tâche Windows
    Par calou34 dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 10/05/2005, 20h42
  3. [SYBASE] gestion de tâches automatiques
    Par gaille dans le forum Sybase
    Réponses: 2
    Dernier message: 16/06/2003, 23h12
  4. HAUTEUR de la barre des tâches de Windows ?
    Par Lung dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 13/12/2002, 11h43
  5. Multithreading sous HP Ux 11
    Par pykoon dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 18/10/2002, 23h36

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