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 :

Threads. Peut-on appeler la méthode d'un thread depuis un autre thread ?


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre averti
    Avatar de Pierre8r
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 518
    Points : 341
    Points
    341
    Par défaut Threads. Peut-on appeler la méthode d'un thread depuis un autre thread ?
    Bonjour,

    Threads.
    Peut-on appeler la méthode d'un thread depuis un autre thread sans nécessité de synchronisation ?

    Ce programme est-il correct ?

    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
    package testthread;
     
    public class TestThreadsStart {
     
    	/**
             * @param args
             */
     
    	private String stringCommun;
     
    	public static void main(String[] args) {
    		System.out.println("Program Begin");
    		ThreadAAA threadAAA = new ThreadAAA();
    		ThreadBBB threadBBB = new ThreadBBB(threadAAA);
    		threadAAA.start();
    		threadBBB.start();
    		System.out.println("Program End");
    	}
     
    }

    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
    package testthread;
     
    public class ThreadAAA extends Thread {
     
    	@Override
    	public void run() {
    		incrementeConmpteur(80, "From ThreadAAA : ");
    	}
     
    	void incrementeConmpteur(int ctr, String strFrom) {
    		for (int i = 0; i < ctr; i++) {
    			System.out.println("ctr : " + ctr + "  " + strFrom + i);
    		}
     
    	};
    }

    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
    package testthread;
     
    public class ThreadBBB extends Thread {
     
    	ThreadAAA threadAAA;
     
    	public ThreadBBB(ThreadAAA threadAAA) {
    		this.threadAAA = threadAAA;
    	}
     
    	@Override
    	public void run() {
    		threadAAA.incrementeConmpteur(10, "Step 1 From ThreadBBB Target 10 : ");
    		threadAAA.incrementeConmpteur(17, "Step 2 From ThreadBBB Target 17 : ");
    		threadAAA.incrementeConmpteur(23, "Step 3 From ThreadBBB Target 23 : ");
    	}
    }

  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,



    Ici il n'y a pas de problème puisque la méthode incrementeConmpteur() est thread-safe !

    En effet, lorsqu'on regarde le code de cette méthode, on voit qu'elle ne manipule que trois références : ctr, strFrom et i.
    Les deux premiers sont des paramètres, le dernier un paramètre local donc aucun soucis de synchronisation !


    Les soucis surviennent lorsqu'on partage des références d'objets non-final, non-immuable et non-thread-safe, où une modification dans un thread peut aboutir à un comportement incorrect dans un autre...

    a++

  3. #3
    Membre averti
    Avatar de Pierre8r
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 518
    Points : 341
    Points
    341
    Par défaut
    Merci adiGuba.

    Quand faut-il encapsuler un traitement dans un thread ?
    Y-a-t-il d'autres circonstances, que lorsqu'on souhaite donner à un traitement une priorité différente par rapport aux autres traitements ?

    Si l'on utilise des classes enveloppes autour de sockets dont les réponses sont asynchrones, faut-il isoler ce code dans un thread ?

  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 tintin92 Voir le message
    Quand faut-il encapsuler un traitement dans un thread ?
    Ben... lorsque tu veux exécuter un traitement "en parallèle"...

    Citation Envoyé par tintin92 Voir le message
    Y-a-t-il d'autres circonstances, que lorsqu'on souhaite donner à un traitement une priorité différente par rapport aux autres traitements ?
    Ce n'est pas vraiment un question de priorité mais d'exécution en parallèle.
    Si tu veux vraiment donner une plus grande priorité à un traitement tu n'as qu'à exécuter seulement ce dernier AVANT les autres...

    Citation Envoyé par tintin92 Voir le message
    Si l'on utilise des classes enveloppes autour de sockets dont les réponses sont asynchrones, faut-il isoler ce code dans un thread ?
    Ben théoriquement les sockets asynchrones sont faite pour du mono-thread... (lire : IV-D. Comment réaliser une application réseau monothread)

    Donc la réponse est la même : tu dois utiliser un second thread seulement si tu as d'autres traitements à faire en parallèle...



    Note : dans une interface graphique il faut bien sûr utiliser un thread afin d'éviter de faire des traitements lourds dans l'EDT (le thread qui gère la mise à jour de l'affichage et les évenements).

    a++

  5. #5
    Membre averti
    Avatar de Pierre8r
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 518
    Points : 341
    Points
    341
    Par défaut
    Merci adiGuba.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 30/10/2013, 12h48
  2. Réponses: 6
    Dernier message: 29/04/2008, 09h34
  3. Réponses: 3
    Dernier message: 19/03/2008, 09h38
  4. [VB6 + ACCESS] Appeler une méthode d'un macro depuis VB6
    Par david71 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 12/07/2007, 17h04

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