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 :

Threader une fonction


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur réseau et sécurité / Consultant
    Inscrit en
    Août 2005
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur réseau et sécurité / Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 1 068
    Par défaut Threader une fonction
    Bonjour à tous,

    Je suis en train de développer une petite classe pour faire différentes opérations mathématiques sur des matrices et j'aimerai threader certaine de mes fonctions comme celle de multiplication de matrice. Voici le code qui fonctionne et qui n'est pas threadé

    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 Matrix multiply(Matrix m) throws Exception{
     
    		double[][] table = new double[this.getNumberOfLines()][this.getNumberOfColumns()];
    		Matrix res = new Matrix(table);
     
    		int k,i,j;
    		long value = 0;
     
    		for (k=0; k<this.getNumberOfColumns(); k++){
    			for (i=1; i<this.getNumberOfLines()+1; i++){ 
    				for (j=0; j<this.getNumberOfColumns(); j++)
    					value += this.matrix[i-1][j]*m.matrix[j][k];
    				res.matrix[i-1][k] = value;
    				value = 0;
    			}
    		}
    		return res;
    	}
    Quelqu'un pourrait-il m'éguiller sur comment réaliser ce que je désire ?

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    si je devais paralléliser ça, je le ferais de cette manière:

    1) créer un ExecutorService avec un certain nombre de threads
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExecutorService pool = Executors.newFixedThreadPool(nbThreads);
    2) dans la boucle extérieure, au lieu de mettre les boucle intérieur, mettre en queue sur l'exécutor un Runnable qui fait la partie intérieure. Comme toutes les itérations internes sont indépendantes, ca ne devrais pas poser de soucis.

    3) faire un shutdown du service et attendre (awaitTemination) que toutes les tâches soient effectuées

    4) retourner la valeur.
    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
     
    		Matrix res = new Matrix(table);
     
    		int k,i,j;
    		long value = 0;
     
    		for (k=0; k<this.getNumberOfColumns(); k++){
                            pool.execute(new ColumnMultiplication(this,table,res,k));
    			/* a mettre dans columnMultiplication
                            for (i=1; i<this.getNumberOfLines()+1; i++){ 
    				for (j=0; j<this.getNumberOfColumns(); j++)
    					value += this.matrix[i-1][j]*m.matrix[j][k];
    				res.matrix[i-1][k] = value;
    				value = 0;
    			}*/
    		}
                    pool.shutdown();
                    while(true){
                        if (pool.awaitTemination(60,TimeUnit.Seconds))
                           return res;
                    }
    	}

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur réseau et sécurité / Consultant
    Inscrit en
    Août 2005
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur réseau et sécurité / Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 1 068
    Par défaut
    Super merci.

    mais je dois faire une nouvelle classe ColumnMultiplication alors ? je peux le faire en classe interne ou pas ?

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    vous pouvez essayer de la faire en interne, mais vu les données qu'elle utilisera de la méthode, il faudra fournir un constructeur malgré tout

  5. #5
    Membre éprouvé
    Homme Profil pro
    Ingénieur réseau et sécurité / Consultant
    Inscrit en
    Août 2005
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur réseau et sécurité / Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 1 068
    Par défaut
    Voila jai fais avec une classe interne private.

    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
    private class ColumnMultiplication implements Runnable{
    		public ColumnMultiplication(Matrix matrix, double[][] table, Matrix res, int k) {
    			double value = 0;
    			for (int i=1; i < matrix.getNumberOfLines()+1; i++){
    				for (int j=0; j < matrix.getNumberOfColumns(); j++)
    					value += matrix.matrix[i-1][j]*table[j][k];
    				res.matrix[i-1][k] = value;
    				value = 0;
    			}
    		}
     
    		@Override
    		public void run() {
    			// TODO Auto-generated method stub
     
    		}
    	}
    Cette classe est donc interne à ma classe Matrix. Ensuite voici le code de ma méthode

    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
    ExecutorService pool = Executors.newFixedThreadPool(10);
     
    	public Matrix threadedMultiply(Matrix m) throws InterruptedException{
    		Thread t = new Thread();
    		t.start();
    		double[][] table = new double[this.getNumberOfLines()][this.getNumberOfColumns()];
    		Matrix res = new Matrix(table);
     
    		long value = 0;
     
    		for (int k=0; k < this.getNumberOfColumns(); k++){
    			pool.execute(new ColumnMultiplication(this,table,res,k));
    		}
    		pool.shutdown();
            while(true){
                if (pool.awaitTermination(60,TimeUnit.SECONDS))
                   return res;
            }
    	}
    J'ai entendu dire qu'au lieu de mettre un fixed pool de thread, on pouvais automatiser le nombre de threads avec newCachedThreadPool(). Sa apporterai quoi de plus ?

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    il y a une erreur dans votre code. Vous faites le calcul dans le constructeur, c'est à dire dans le thread principal, et vos thread du pool font du "rien" (run vide). Mettez le calcul dans le run, sinon ça sert à rien

Discussions similaires

  1. Threader la fonction d'une classe
    Par I-DEXX dans le forum C++
    Réponses: 8
    Dernier message: 03/11/2013, 00h07
  2. Comment chronométrer une fonction
    Par 323 dans le forum Pascal
    Réponses: 3
    Dernier message: 19/03/2003, 20h24
  3. [VBA-E] avec une fonction value
    Par laas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2002, 13h22
  4. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

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