application des threads en java
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 31

application des threads en java



  1. #1
    saniadaff

    application des threads en java


    ------

    Bonjour tout le monde;

    Je voudrais traduire un programme en applicant les threads en java;

    Explication:

    Un diamand est tombé sur un tronçon de dix km; pour chercher on decide de deployer dix equipes dont chacune travaillant sur 1 km de façon simultanée; si une equipe retrouve l'information passe aux autres equipe et le travail s'arrête;

    Si je prends un exemple de recherche du code d'un eleve sur 200;

    on lance la recherche simultanée càd 4 parcourt de 50/50, comment créer des instances (4 instances) qui s'execute de façon simultanée; on parle de thread;

    le code sequentiel est ici(je n'ai pas compilé ce code) c'est pour juste donner une idée donc vous m'excuserez en cas d'erreur:

    Code:
    /*import java.math.*; 
    import java.math.BigDecimal;
    import java.math.BigInteger;
    import java.util.ArrayList;
    import java.util.Random;
    import java.util.Scanner;*/
    import java.util.concurrent.TimeUnit;
    
    public class exemple {
    
    	public static void main(String[] args) {
    	     long startTime = System.nanoTime();
    	     bool u=eleve(tab, n);
    	     System.out.println(timeElapsed+ " nns ");
    	     System.out.println(timeElapsed / 1000000+" mlls ");
    	     System.out.println( minutes +" Minutes " + seconds+" secondes");
    	     stdin.close();	
    	}
    	public bool eleve(long tab[200], n) {
    
    		long code=n;
                    int v=50;
                    bool trouve=false;
    
               while(v!=200 && trouve==false){
    
                  for(int i=1;i<v;i++)
                      if(tab1[i]==code
                      trouve=true;
                  v+=50;
                 }
    		   
    	 return trouve ;
    		
    		      
    	       }
    
         fonction2()
         fonction3()
    
         etc...	
    	
         }
    comment preparer le main() qui a aussi des code puis les autres fonction sachant que le thread se fait uniquement en fonction de la variable v qui varie de 50 à 50.

    Merci pour votre aid

    -----

  2. #2
    umfred

    Re : application des threads en java

    je dirais que la fonction de recherche a en paramètre sa table de recherche qui est la table d'origine divisée par le nombre de tâches voulues (ça peut aussi être 3 paramètres: la table, l'indice de début et le nombre d'élément)

  3. #3
    vgondr98

    Re : application des threads en java

    Si le but est de paralléliser un calcul, il y a la possibilité d'utilisé les Stream en java :
    Code:
    IntConsumer CalculDistanceSNP = new IntConsumer() {
    
    			@Override
    			public void accept(int indice) {
                                     Entry<Object, Map<String, Object>> patient1 = patients[indice];
                            }
    };
    IntStream.range(0, patients.length - 1).parallel().forEach(CalculDistanceSNP);
    Cela marche assez bien, je trouve.
    Il ne faut pas oublier la fonction parallel() sur l'objet IntStream et il n'y a pas que IntStream, par exemple :

    List<Stream> liste;
    liste.parallelStream().forEach (action);

    où action est un object Consumer.
    Dernière modification par vgondr98 ; 22/12/2023 à 16h52.

  4. #4
    vgondr98

    Re : application des threads en java

    Dans mon code, j'utilise ce type d'objet :
    Map<Integer,Integer> comptage = new ConcurrentHashMap<Integer,Inte ger>();
    Cela peut être utilisé pour transmettre de l'information entre les différents calcul, je pense.

  5. A voir en vidéo sur Futura
  6. #5
    saniadaff

    Re : application des threads en java

    Bonsoir Monsieur umfred;

    Oui mais mon souci est son implementation avec le threads;

    j'en ai besoin pour mon programme qui est assez simillaire, si je traduit ça alors je pourrai m'en sortir avec mon programme;

    Bonsoir Monsieur vgondr98;

    Si vous pouvez implementez le code ci-dessus pour que je puis me rendre compte que c'est plus pratique;

    J'ai dejà pris assez de temps de lecture avec les threads et je voudrais fixer mon esprit avec cet exemple pour pouvoir avancer;

    les stream sont ma première nouvelle dont je pourrez continuez à apprendre après si je n ' ai d'application direct.

    Merci d'avance.

  7. #6
    polo974

    Re : application des threads en java

    En gros, il faut lancer la boucle intérieure ( le for) dans un thread (donc dans une fonction).
    Il faut déclarer trouve en static global ou un truc du genre. (idem ou similaire (fouiller doc thread java) pour les variables qui devront être partagées)
    Mais il faut aussi ajouter && trouve == false dans la condition du for.
    Et en fin du main faire un join de chaque thread lancé.

    Voir la doc java et les x millions d'exemples ou tutos dispos, par contre, ne pas s'arrêter à "chouette ça fonctionne", mais à "ouf, ça y est, j'ai compris chaque pièce de code"...
    Jusqu'ici tout va bien...

  8. #7
    Ikhar84
    Animateur Informatique

    Re : application des threads en java

    Peut être commencer par un ou deux thread qui affiche(nt) un message dans la console ?
    J'ai glissé Chef !

  9. #8
    saniadaff

    Re : application des threads en java

    Ok la bonne nouvelle chez moi est qu'avec mon projet il n y a pas de problème de compilation;

    Sauf je n'arrive pas a mettre firsttrhead.join(); dans main()

    Mais l'execution reste à desirer;

    il va falloir que je travail l'exemple ci-dessus et afficher le probleme

  10. #9
    saniadaff

    Re : application des threads en java

    Bonjour;

    J'ai travaillé sur l'exemple voilà ce que ça me donne:

    d'abord le code:
    Code:
    package exemple2;
    
    import java.util.Scanner;
    
    
    public class exemple2 extends Thread {
    	static long[]tab = {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, 40,
                41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
                51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
                61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
                71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
                81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
                91, 92, 93, 94, 95, 96, 97, 98, 99, 100,
                101, 102, 103, 104, 105, 106, 107, 108, 109, 110,
                111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
                121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
                131, 132, 133, 134, 135, 136, 137, 138, 139, 140,
                141, 142, 143, 144, 145, 146, 147, 148, 149, 150,
                151, 152, 153, 154, 155, 156, 157, 158, 159, 160,
                161, 162, 163, 164, 165, 166, 167, 168, 169, 180,
                181, 182, 183, 184, 185, 186, 187, 188, 189, 190,
                191, 192, 193, 194, 195, 196, 197, 198, 199, 200,
               };
       static long n;
       static int v;
       static int i;
       static boolean trouve;
        exemple2 ( long n1, int i1, int v1) {
             n=n1;
             i=i1;
             v=v1;
            }
    
          public void run() {
    	
            for(int i2=i;i2<=v;i2++){
              if(tab[i]==n)
                 trouve=true;
              System.out.println("i= "+i); 
              System.out.println("v= "+v); 
              System.out.println("code= "+n);
              System.out.println("tab[i]= "+tab[i]);
               }
            
          }
    
    	public static void main(String[] args) {
    		long startTime = System.nanoTime();
    		Scanner stdin = new Scanner(System.in);					
    		System.out.println("Entrez code à chercher:");
    		long mynum = stdin.nextLong();		 
    	    v=50;
    	    i=1;
    		for(int i=1;i<=4;i++){
    			Thread T = new exemple2(mynum, i, v);
                T.start();
                //T.join();
                i=v;
                v+=50;
            }
    System.out.println("Resultat de la recherche est "+trouve);    	 	        	  
    	        		 
    			  				  				 
    		 long endTime = System.nanoTime();
    		 long timeElapsed = endTime - startTime;
    		      timeElapsed = timeElapsed / 1000000;
    		 long minutes = (timeElapsed / 1000) / 60;
    		 long seconds = (timeElapsed / 1000) % 60;
    		 
    	     System.out.println(timeElapsed+ " nns ");
    	     System.out.println(timeElapsed / 1000000+" mlls ");
    	     System.out.println( minutes +" Minutes " + seconds+" secondes");
    	     stdin.close();	
    
    		
    	}
    
    }
    ce que ça affiche

    Code:
    Entrez code à chercher:
    120
    Resultat de la recherche est false
    8458 nns 
    0 mlls 
    0 Minutes 8 secondes
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    i= 1
    v= 100
    code= 120
    tab[i]= 2
    Même join() je n'arrive pas à le mettre dans la boucle;

    Dans mon projet toutes les instances sont melangées; d'ailleur c'est un peut different car ça renvois null*null

    Merci d'avance pour votre aide;

  11. #10
    polo974

    Re : application des threads en java

    Pourquoi tout mettre dans la classe derivee du thread? (Même le main sauf erreur) bon, c'est un détail, mais ça mélange tout. (Point de vue perso)

    Dans le main, tu crées 4 threads que tu nommes tous T. Comment veux-tu t'y retrouver ensuite?
    Au mieux, tu ne lances que le dernier.

    Gros pb avec les static... n, i, v, trouve ((java n'est pas mon pote, donc à vérifier) si ça veut dire variable de classe, i et v ne doivent pas l'être. n, on s'en fout un peut, c'est une constante, mais bof quand même...

    Dans ton run, c'est un "détail", mais quand tu as trouvé, il faut sortir de la boucle, donc test de la variable dans la condition du for.

    Autre détail dans ton run, tu crées i2, mais tu utilises i en index de tableau... utilise des noms "qui parlent" (de tout façon, java est verbeux, personne ne t'en voudra).


    Comme tu ne fais pas de join, main finit en premier, puis le seul thread que tu as lancé se met à rouler...
    Jusqu'ici tout va bien...

  12. #11
    polo974

    Re : application des threads en java

    Ah, oups mauvaise lecture, entre l'indentation et les accolades qui se baladent...
    Tu crées puis lances tes threads dans la boucle.
    Il faut une autre boucle pour y faire les join.

    Et stocker les thread entre...
    Jusqu'ici tout va bien...

  13. #12
    pm42

    Re : application des threads en java

    Citation Envoyé par polo974 Voir le message
    Dans le main, tu crées 4 threads que tu nommes tous T. Comment veux-tu t'y retrouver ensuite?
    Au mieux, tu ne lances que le dernier.
    Non, il les lance tous parce qu'il fait le start dans la boucle.
    Ce n'est pas évident parce qu'il n'indente pas son code correctement mais c'est le cas.
    Par contre, cela rend le join impossible en effet. Il faudrait les mettre dans un tableau, faire une boucle qui fait le start puis une autre boucle qui ne fait que les join.

    Citation Envoyé par polo974 Voir le message
    Gros pb avec les static... n, i, v, trouve ((java n'est pas mon pote, donc à vérifier) si ça veut dire variable de classe, i et v ne doivent pas l'être. n, on s'en fout un peut, c'est une constante, mais bof quand même...
    En effet mais c'est parce qu'il ne code pas en objet : tout son code est procédural.

  14. #13
    saniadaff

    Re : application des threads en java

    Merci pour vos interventions ;
    Pardons aidez moi à corriger puis me balancer ;
    Il y avait une seule variable à partager (v)
    qui subdivise la recherche en 4 donc je l'ai mis en sstatic
    Mais pour des difficultés d'initialisation

    je i je l'ai mis en static, premier thread i=1 ou 0 et me deuxième l=50 etc... Tandis que i<v borne supérieure
    Je crois que n peut être aussi static
    Dans mon projet j'ai une seule variable diviseur qui est calculée dans main() et passe dans le paramètre du thread
    Vous pouvez m'aider à démêler le thread et le main pour qu'ils ne soient pas de même classe
    En plus ce tableau....?

  15. #14
    saniadaff

    Re : application des threads en java

    Bonjour Monsieur pm42,
    Aidez moi pour les objets

  16. #15
    saniadaff

    Re : application des threads en java

    C'est toujour la galaire;

    J'ai trouve ce code mais toujour les erreurs

    Code:
    package exemple2;
    
    import java.util.ArrayList;
    import java.util.Scanner;
    
    
    public class exemple2 extends Thread {
    	static long[]tab = {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, 40,
                41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
                51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
                61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
                71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
                81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
                91, 92, 93, 94, 95, 96, 97, 98, 99, 100,
                101, 102, 103, 104, 105, 106, 107, 108, 109, 110,
                111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
                121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
                131, 132, 133, 134, 135, 136, 137, 138, 139, 140,
                141, 142, 143, 144, 145, 146, 147, 148, 149, 150,
                151, 152, 153, 154, 155, 156, 157, 158, 159, 160,
                161, 162, 163, 164, 165, 166, 167, 168, 169, 180,
                181, 182, 183, 184, 185, 186, 187, 188, 189, 190,
                191, 192, 193, 194, 195, 196, 197, 198, 199, 200,
               };
             static long n;
             static int v;
             static int i;
             static boolean trouve;
    
              exemple2 ( long n1, int i1, int v1) {
             n=n1;
             i=i1;
             v=v1;
    
               }
    
             public void run() {
    	    //sortie:
            for(int i2=i;i2<v;i2++){
              if(tab[i2]==n){
                 trouve=true;
                 break ;//sortie;
                // T.currentThread().interrupt(); quand ça trouve normalement tous les autres threads doivent s'arrêter mais ça ne fonctionne pas
              }
              System.out.println("i= "+i); 
              System.out.println("v= "+v); 
              System.out.println("code= "+n);
              System.out.println("tab[i]= "+tab[i]);
               }
            
          }
    
    	public static void main(String[] args) {
    		long startTime = System.nanoTime();
    		Scanner stdin = new Scanner(System.in);					
    		System.out.println("Entrez code à chercher:");
    		long mynum = stdin.nextLong();
    		ArrayList<Thread> T= new ArrayList<Thread> ();
    	        v=50;
    	         i=0;
    
    		for(int i1=0;i1<4;i1++){
    			Thread T1 = new exemple2(mynum, i, v);
    			T.add(T1);            
                             i=v;
                             v+=50;
                    }
    		
                   for(int i=0;i<T.size();i++){
    			T.get(i).start();
                     }
    		
                   for(int i=0;i<T.size();i++){
    
    			 try {
    	                T.get(i).join();
    	                 } catch (InterruptedException e) {
    	                e.printStackTrace();
    	              }
                }
    		
            System.out.println("Resultat de la recherche est "+trouve);    	 	        	  
    	        		 
    			  				  				 
    		 long endTime = System.nanoTime();
    		 long timeElapsed = endTime - startTime;
    		      timeElapsed = timeElapsed / 1000000;
    		 long minutes = (timeElapsed / 1000) / 60;
    		 long seconds = (timeElapsed / 1000) % 60;
    		 
    	     System.out.println(timeElapsed+ " nns ");
    	     System.out.println(timeElapsed / 1000000+" mlls ");
    	     System.out.println( minutes +" Minutes " + seconds+" secondes");
    	     stdin.close();	
    
    		
    	}
    
      }
    le code erreur:

    Code:
    Entrez code à chercher:
    5
    Exception in thread "Thread-0" Exception in thread "Thread-1" Exception in thread "Thread-2" Resultat de la recherche est false
    3015 nns 
    0 mlls 
    0 Minutes 3 secondes
    java.lang.ArrayIndexOutOfBoundsException: 200
    	at exemple2.exemple2.run(exemple2.java:41)
    java.lang.ArrayIndexOutOfBoundsException: 200
    	at exemple2.exemple2.run(exemple2.java:41)
    java.lang.ArrayIndexOutOfBoundsException: 200
    	at exemple2.exemple2.run(exemple2.java:41)
    Exception in thread "Thread-3" java.lang.ArrayIndexOutOfBoundsException: 200
    	at exemple2.exemple2.run(exemple2.java:41)
    ce n'est pas facile
    Dernière modification par saniadaff ; 26/12/2023 à 03h00.

  17. #16
    polo974

    Re : application des threads en java

    j'ai repris en partie le code, en ajoutant des commentaires, mettant des noms de variables qui veulent dire qq choses et ça roule.

    accessoirement, corrigé les nombreuses erreurs...

    mais c'est pas le plus beau, et j'ai renommé la classe ...

    ah, et puis, j'ai refait l'indentation...

    bref, j'ai tout fait... (en fait, je voulais juste voir si je savais encore faire du jaja... conclusion: ça rentrera pas dans mes priorités...)

    Code:
    package gag;
    
    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class gag extends Thread {
        static long[] tab = {
            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, 40,
            41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
            51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
            61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
            71, 72, 73, 74, 75, 76, 77, 78, 79, 80,  // il manquait cette ligne...
            81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
            91, 92, 93, 94, 95, 96, 97, 98, 99, 100,
            101, 102, 103, 104, 105, 106, 107, 108, 109, 110,
            111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
            121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
            131, 132, 133, 134, 135, 136, 137, 138, 139, 140,
            141, 142, 143, 144, 145, 146, 147, 148, 149, 150,
            151, 152, 153, 154, 155, 156, 157, 158, 159, 160,
            161, 162, 163, 164, 165, 166, 167, 168, 169, 170,
            171, 172, 173, 174, 175, 176, 177, 178, 179, 180,
            181, 182, 183, 184, 185, 186, 187, 188, 189, 190,
            191, 192, 193, 194, 195, 196, 197, 198, 199, 200,
        };
        static long n_a_trouver; // valeur a trouver
        static boolean trouve; // flag 
    
        int debut; // pour chaque thread
        int fin; // pour chaque thread
        int num; // pour chaque thread juste pour print...
    
        gag ( int new_debut, int new_fin, int new_num) {
            debut = new_debut;
            fin = new_fin;
            num = new_num; // pour print
        }
    
        public void run() {
            System.out.println("run" + num + " debut " + debut + " fin " + fin);
            for(int i = debut; (i < fin) && (trouve != true); i++) { // le test de trouve pour les autres thread aussi...
                if(tab[i] == n_a_trouver) {
                    trouve = true;
                    System.out.println("run" + num + " trouve ! ! !");
                }
            }
            System.out.println(" fin run" + num);
        }
    
        public static void main(String[] args) {
            long startTime = System.nanoTime();
            Scanner stdin = new Scanner(System.in);
            System.out.println("Entrez code à chercher:");
            n_a_trouver = stdin.nextLong();
    
            ArrayList<Thread> TAL= new ArrayList<Thread> ();
    
            int new_debut = 0;
            int new_fin = 50;
            int i;
    
            System.out.println("boucle lancement");
            for(i = 0; i < 4; i++) {
                System.out.println("new et start Th" + i);
                Thread Th = new gag(new_debut, new_fin, i);
                Th.start();
                TAL.add(Th);
                new_debut = new_fin;
                new_fin += 50;
            }
    
            System.out.println("boucle join");
            for(i = 0; i < TAL.size(); i++){
                try {
                    System.out.println("join Th" + i);
                    TAL.get(i).join();
                    System.out.println("join Th" + i + " fait");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    
            System.out.println("Resultat de la recherche est "+trouve);
    
            long endTime = System.nanoTime(); // la, j'ai rien regarde...
            long timeElapsed = endTime - startTime;
            timeElapsed = timeElapsed / 1000000;
            long minutes = (timeElapsed / 1000) / 60;
            long seconds = (timeElapsed / 1000) % 60;
    
            System.out.println(timeElapsed+ " nns ");
            System.out.println(timeElapsed / 1000000+" mlls ");
            System.out.println( minutes +" Minutes " + seconds+" secondes");
            stdin.close();
        }
    
    }
    Jusqu'ici tout va bien...

  18. #17
    saniadaff

    Re : application des threads en java

    Merci jusqu'ici tout va bien!

    Maintenant il y a une attente longue dans mon projet car il faut attendre la fin de tous les threads

    J'ai utilisé ça dans run mais ça ne compile pas : Th.currentThread().interrupt() ;

    Je voudrais arrêter tous les threads en cour quand l'un des threads trouve;

    Merci d'avance

  19. #18
    polo974

    Re : application des threads en java

    Citation Envoyé par saniadaff Voir le message
    Merci jusqu'ici tout va bien!
    heu, moi, c'est polo974,
    "Jusqu'ici tout va bien...", c'est ma signature (sardonique relative à notre comportement face aux dégâts environnementaux dont nos descendants hériteront, mais ce n'est pas le sujet..)
    Maintenant il y a une attente longue dans mon projet car il faut attendre la fin de tous les threads
    ...

    Merci d'avance
    Mais non. dans le for du run, j'ai mis la condition :
    Code:
     (i < fin) && (trouve != true)
    
    Ce qui fait que dès qu'un thread trouve, les autres sortent du for au moment de boucler, donc finissent d'eux-même également.
    Comme chaque itération est rapide, ce n'est pas grave de devoir attendre le bouclage dans le for pour sortir.


    Du coup, pas besoin de vouloir tuer les autres. Et en plus, ce n'est pas si évident à faire proprement.

    Dans un cas où des opérations (quasi) bloquantes sont dans la boucle, ça peut se concevoir, mais il faut être certain de ne pas laisser une partie du travail "le cul entre 2 chaises", donc dans le thread, il faut catcher l'interruption et poser proprement les crayons, donc avoir préparé le terrain... Bref, tout un programme.

    Ici, ça ne se voit pas trop, vu que la boucle ne fait qu'un test, mais si elle lançait un traitement en coopération avec d'autres programmes par exemple, il faut bien préparer la rupture que peut engendrer une interruption...

    Pour faire ce genre d'opé, il faudrait soit que le thread "gagnant" s'occupe d'interrompre ses voisins qui tournent encore, soit il faut un lock ou un truc du même tonneau que le thread principal attend à la place des join pour interrompre les thread qui tournent encore.
    Jusqu'ici tout va bien...

  20. #19
    pm42

    Re : application des threads en java

    Citation Envoyé par polo974 Voir le message
    Mais non. dans le for du run, j'ai mis la condition :
    Code:
     (i < fin) && (trouve != true)
    
    Ce qui fait que dès qu'un thread trouve, les autres sortent du for
    Pas forcément. Il faudrait le mettre "volatile". Sinon, les optimisations du compilateur et des architectures processeur peuvent faire que des threads gardent une version en cache de cette variable et ne voient pas qu'un autre l'a changé.

    https://www.baeldung.com/java-volatile

  21. #20
    polo974

    Re : application des threads en java

    Ah oui, je l'ai loupé celui-là (de piège),
    il faut déclarer trouve à la fois static (pour qu'il n'y ait qu'une copie "de classe") et volatile pour qu'elle ne soit pas mise en cache...

    Code:
        static volatile boolean trouve;
    static n'est pas le contraire de volatile ! ! !



    @saniadaff

    attention, ici, c'est cool, on positionne la variable trouve, on ne fait pas de calcul dessus.

    au cas contraire (genre un compteur ou un truc plus compliqué, il faut protéger le code modifiant la variable pour ne pas être interrompu au beau milieu de la modification https://www.baeldung.com/java-synchr...ferent-threads)
    Jusqu'ici tout va bien...

  22. #21
    pm42

    Re : application des threads en java

    Citation Envoyé par polo974 Voir le message
    Ah oui, je l'ai loupé celui-là (de piège),
    Tu n'est pas le premier parce que c'est peu utilisé.
    On utilise soit des lock via synchronized soit des types dédiées comme AtomicBoolean pour ce genre de chose le plus souvent.

  23. #22
    saniadaff

    Re : application des threads en java

    Bonjour Monsieur polo974
    Référence à votre signature c'est vous faire plaisir
    Bonjour Monsieur pm42
    L'exemple marche à merveille mais mon projet qui est dépendant d'une seule variable diviseur qui ne finit pas vite alors qu'en regardant le début d'exécution on voit bien que c'est déjà trouvé
    Dans le run j'ai les if et les while
    Dans If, s'il trouve une variable de sortie sera égal à 0 sinon on entre dans while si l'on trouve dans while, r=0 qui est la deuxième condition de sortie
    Peut être je vais essayer ce r en static et voir...
    Sinon le projet marche bien car résultat est là
    Merci à tous les deux
    Dernière modification par saniadaff ; 27/12/2023 à 13h26.

  24. #23
    polo974

    Re : application des threads en java

    Le flag commun de fin de recherche doit être comme indiqué par pm42:
    Soit static volatile boolean (à l'ancienne)
    Soit AtomicBoolean (plus propre et moderne, c'est fait exprès pour mais ça ne dispense pas de lire la doc).
    Soit ... plus compliqué...

    https://www.baeldung.com/java-volatile-vs-atomic

    Et tout le thème :
    https://www.baeldung.com/category/java/java-concurrency

    En fait, tout le site à l'air bien pour occuper les longues soirées d'hiver...
    Dernière modification par polo974 ; 27/12/2023 à 17h47.
    Jusqu'ici tout va bien...

  25. #24
    saniadaff

    Re : application des threads en java

    Bonjour Monsieru polo974 et Monsieur pm42;
    Ma soufrance n a pas encore pris fin;
    Le temps d'execution avant l'utilisation du thread reste le même avec le thread.
    Il y a un seul soulagement; le calcule est correcte et on le trouve toujours en debut d'execution.
    mais il faut attendre que tous les threads prennent fin.

    sinon voici mes la declaration de mes variables partagées avec les threads:

    BigInteger f;
    static BigInteger m1=new BigInteger("0");
    static BigInteger m2=new BigInteger("0");
    BigDecimal Diviseur;
    BigInteger r1=new BigInteger("0");
    volatile static BigInteger r2=new BigInteger("0");
    volatile boolean trouve=false;

    J'ai trouvé ça dans la documentation mais je suis entrain d'implementer avec l'exemple que vous avez traité pour moi; seulement je ne sais pas d'abord comment prendre mes pieds.

    où mettre le contenu de run car ici je vois que run met le booleen à vrai et peut interrompre les threads


    Code:
    public class ControlSubThread implements Runnable {
    
        private Thread worker;
        private final AtomicBoolean running = new AtomicBoolean(false);
        private int interval;
    
        public ControlSubThread(int sleepInterval) {
            interval = sleepInterval;
        }
     
        public void start() {
            worker = new Thread(this);
            worker.start();
        }
     
        public void stop() {
            running.set(false);
        }
    
        public void run() { 
            running.set(true);
            while (running.get()) {
                try { 
                    Thread.sleep(interval); 
                } catch (InterruptedException e){ 
                    Thread.currentThread().interrupt();
                    System.out.println(
                      "Thread was interrupted, Failed to complete operation");
                }
                // do something here 
             } 
        } 
    }
    et ça aussi

    Code:
    public class ControlSubThread implements Runnable {
    
        private Thread worker;
        private AtomicBoolean running = new AtomicBoolean(false);
        private int interval;
    
        // ...
    
        public void interrupt() {
            running.set(false);
            worker.interrupt();
        }
    
        boolean isRunning() {
            return running.get();
        }
    
        boolean isStopped() {
            return stopped.get();
        }
    
        public void run() {
            running.set(true);
            stopped.set(false);
            while (running.get()) {
                try {
                    Thread.sleep(interval);
                } catch (InterruptedException e){
                    Thread.currentThread().interrupt();
                    System.out.println(
                      "Thread was interrupted, Failed to complete operation");
                }
                // do something
            }
            stopped.set(true);
        }
    }
    Moi je veux le faire avec le Thread et non avec le runnable;

    Je suis entrain de me familiariser avec la classe Thread.

    Merci d'avance

  26. #25
    polo974

    Re : application des threads en java

    trouve n'est pas static, donc il existe dans chaque classe (donc thread), pas bon pour communiquer inter thread...
    voir #20
    Citation Envoyé par polo974 Voir le message
    Ah oui, je l'ai loupé celui-là (de piège),
    il faut déclarer trouve à la fois static (pour qu'il n'y ait qu'une copie "de classe") et volatile pour qu'elle ne soit pas mise en cache...

    Code:
        static volatile boolean trouve;
    static n'est pas le contraire de volatile ! ! !
    ah, et puis le concept d'interrupt est assez peu interruptif coté thread en java (et pas que), il faut tester si interrupted et choisir de sortir (ou non)...
    Dernière modification par polo974 ; 29/12/2023 à 10h56.
    Jusqu'ici tout va bien...

  27. #26
    saniadaff

    Re : application des threads en java

    Merci pour votre aide;

    Je n'arrive pas à comprendre totalement.

    Cette decomposition: 1000000000000003 = 14902357 * 67103479 avec 168 Threads fait 15 environs minutes;

    Avec 1625 Threads fait environs 13 minutes.

    Par contre cette decomposition: 1000000000000009 = 17324969*57720161 avec 1625 Threds fait 26 secondes.

    17324969=367*47207 fait 12 secondes.

    Voir ici

    Code:
    Entrez votre RSA nombre pour chercher ses facteurs premiers:
    1000000000000009
    
    
    
    join Th1685 fait
    join Th1686
    join Th1686 fait
    join Th1687
    join Th1687 fait
    join Th1688
    join Th1688 fait
    join Th1689
    join Th1689 fait
    join Th1690
    join Th1690 fait
    join Th1691
    join Th1691 fait
    join Th1692
    join Th1692 fait
    join Th1693
    join Th1693 fait
    join Th1694
    join Th1694 fait
    join Th1695
    join Th1695 fait
    join Th1696
    join Th1696 fait
    join Th1697
    join Th1697 fait
    join Th1698
    join Th1698 fait
    f=17324969*57720161
    26119 nns 
    0 mlls 
    0 Minutes 26 secondes
    Pour 17324969
    je n'ai pas pu intercepter tout
    Code:
    join Th1698
    join Th1698 fait
    f=367*47207
    12907 nns 
    0 mlls 
    0 Minutes 12 secondes
    Merci je vais continuer à optimiser
    Dernière modification par saniadaff ; 02/01/2024 à 03h11.

  28. #27
    ArchoZaure

    Re : application des threads en java

    Citation Envoyé par saniadaff Voir le message
    Avec 1625 Threads fait environs 13 minutes.
    Super...
    Donc en fait vous avez 1625 processeurs et ça va booster un max...
    Ben non, vous n'en avez pas autant, donc plus vous mettrez de threads sur un même process, et moins ça sera efficace.
    Le multitâche sur un même processeur consiste à passer d'une tâche à l'autre ALTERNATIVEMENT donc à la suite, ce qui ralentit tout du fait que passer de l'activation d'un thread à un autre COUTE du traitement (hors celui du calcul du traitement programmatique) EN PLUS.
    Il y a de la gestion de thread EN PLUS.

    Donc soumettre EN PARALLÈLE une partie du traitement à des threads ne présente aucun intérêt en terme de temps de calcul si les threads ne sont pas TOUS reliés à des processeurs indépendants (pouvant donc travailler en parallele).

    Gagner du temps de calcul n'est d'autre part possible uniquement que si vous pouvez paralléliser des parties du calcul.
    Chaque processeur/thread fait une partie du calcul en parallele, et on réassemble le tout à la fin.
    Ici, c'est une question d'algorithme et ce n'est pas toujours possible.

  29. #28
    saniadaff

    Re : application des threads en java

    Bonsoir Monsieur
    Oui en fait aucun calcul n'est répété.
    Il y a une variable diviseur qui subdivise le calcule en portions de calcule.
    Le premier nombre dont j'ai fait référence est décomposé avec le même algo sans les threads en 3 heures 14 minutes
    Le deuxième a dépassé aussi les 2h puis je l'ai stoppé
    Mais j'ai aussi compris ce lenteur. c'est pour quoi je suis à la recherche d'un super ordinateur et si j'ai l'accès peut être mon algo pourrait porter fruits

  30. #29
    ArchoZaure

    Re : application des threads en java

    AU lieu de faire du traitement parallele, vous pouvez éventuellement distribuer le calcul sur plusieurs machines :
    Bien sûr les ordinateurs ne sont pas virtuels.
    Avec ça https://fr.wikipedia.org/wiki/Hadoop...20donn%C3%A9es.

  31. #30
    saniadaff

    Re : application des threads en java

    Je dois avoir plusieurs machines alors que je n'en ai qu'une seule

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. Application en JAVA.
    Par Shazen7 dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 01/07/2022, 07h35
  2. Java Application
    Par armelito60 dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 15/12/2017, 16h20
  3. Application de l'AG en java
    Par memy dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 07/04/2015, 05h45
  4. Les threads en java
    Par invite585703c8 dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 19/06/2011, 10h14
  5. application java et applet
    Par invitec5b86fa9 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 06/03/2006, 20h03