Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    213

    thread che non sono concorrenti

    ciao a tutti. ho scritto questo programma per avere più flussi di esecuzione, ma a quanto pare sembra che funzioni uno thread alla volta e non riesco a capire il perchè.
    codice:
    package javaapplication1;
    
    import java.io.*;
    import java.net.*;
    import java.lang.*;
    import java.util.*;
    
    class pingati031 extends connessione implements Runnable{
        public void run(){}
        public Vector ipdapingare031(byte[]mioip,int[]altroip,boolean x,int i,int j,InetAddress indirizzo,Vector ipcherispondono031)throws Exception{
          for(i=0;i<10;i++){
                      for(j=0;j<256;j++){
                          altroip[2]=i;
                          altroip[3]=j;
                          mioip[0]=(byte)altroip[0];
                          mioip[1]=(byte)altroip[1];
                          mioip[2]=(byte)altroip[2];
                          mioip[3]=(byte)altroip[3];
                          x=indirizzo.getByAddress(mioip).isReachable(5000);
                          indirizzo=InetAddress.getByAddress(mioip);
                          if(x){
                              System.out.print("\n"+altroip[0]+"."+altroip[1]+"."+altroip[2]+"."+altroip[3]+" pinga");
                               ipcherispondono031.add(indirizzo);
          
        }
    }
          }return ipcherispondono031;}}
    
    class pingati3263 extends connessione implements Runnable{
        public void run(){}
        public Vector ipdapingare3263(byte[]mioip,int[]altroip,boolean x,int i,int j,InetAddress indirizzo,Vector ipcherispondono3263)throws Exception{
          for(i=10;i<12;i++){
                      for(j=0;j<256;j++){
                          altroip[2]=i;
                          altroip[3]=j;
                          mioip[0]=(byte)altroip[0];
                          mioip[1]=(byte)altroip[1];
                          mioip[2]=(byte)altroip[2];
                          mioip[3]=(byte)altroip[3];
                          x=indirizzo.getByAddress(mioip).isReachable(5000);
                          indirizzo=InetAddress.getByAddress(mioip);
                          if(x){
                              System.out.print("\n"+altroip[0]+"."+altroip[1]+"."+altroip[2]+"."+altroip[3]+" pinga");
                              ipcherispondono3263.add(indirizzo);
    
        }
    }
          }return ipcherispondono3263;}}
    
    
    public class connessione extends Thread {
        public static void main(String[]args)throws Exception{
    
           InetAddress indirizzo=null;
           NetworkInterface rete=null;
           byte []mioip=new byte[4];
           int[] altroip=new int[4];
           short s;
           int i=0;
           int j=0;
           int k;
           boolean x=false;
           boolean y;
           String nome;
           Vector ipcherispondono031= new Vector();
           Vector ipcherispondono3263=new Vector();
           Vector stampanti=new Vector();
    
           mioip=indirizzo.getLocalHost().getAddress();
           rete=NetworkInterface.getByInetAddress(indirizzo.getLocalHost());
           System.out.println(rete);
           List<InterfaceAddress> indirizzi = rete.getInterfaceAddresses();
           for (InterfaceAddress elem : indirizzi) {
               System.out.println(elem.toString());
               System.out.println(elem.getNetworkPrefixLength());
               s=elem.getNetworkPrefixLength();
               if(s==16){
               altroip[0]=(int)mioip[0];
               altroip[1]=(int)mioip[1];
               pingati031 e=new pingati031();
               pingati3263 p=new pingati3263();
               e.start();
               p.start();
               e.ipdapingare031(mioip, altroip, x, i, j, indirizzo, ipcherispondono031);
               p.ipdapingare3263(mioip, altroip, x, i, j, indirizzo, ipcherispondono3263);
               
             }
         }
      }
    }
    non riesco a capire cosa ci sia di sbagliato.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: thread che non sono concorrenti

    Originariamente inviato da terso88
    non riesco a capire cosa ci sia di sbagliato.
    C'è parecchio di sbagliato ....
    Innanzitutto non vedo perché la classe principale, quella che hai il main() deve estendere Thread. Fai le cose "pulite" e o istanzi direttamente i thread oppure fai un'altra classe.

    Oltretutto è una dichiarazione "contorta" ... pingati031 e pingati3263 estendono la classe principale (ripeto che non ne vedo il motivo) e implementano Runnable .... che comunque già lo implementa Thread.

    Poi comunque la prima cosa che "salta" all'occhio è che i run() delle tue classi sono vuoti.

    Un:
    public void run(){}

    a che cosa ti serve, visto che non fa "nulla"???

    Hai istanziato i thread .... e li hai fatti pure partire con start() .... ma il run() è come ho detto vuoto e poi invochi tu esplicitamente ipdapingare031() (e poi l'altro). Ma così non c'è nulla di "concorrente" visto che li invochi tu esplicitamente dal "main thread".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    213
    essendo run un metodo voi e non potendo fare l'overloading non mi serve a niente visto che nel main mi deve ritornare il vector con gli indirizzi ip che rispondono

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da terso88
    essendo run un metodo voi e non potendo fare l'overloading non mi serve a niente visto che nel main mi deve ritornare il vector con gli indirizzi ip che rispondono
    Il run() (gestito da un java.lang.Thread avviato, ovviamente) è quello che serve per eseguire il "lavoro" in un flusso di esecuzione separato.

    Il run() è senza argomenti e ritorna void ... è così e tale deve stare. Se vuoi passare dati al thread o ritornare dati alla fine del thread devi farlo in altro modo.
    Il tuo Runnable è un oggetto, può avere delle variabili di istanza e anche un costruttore per assegnare tali variabili. Il run() può cambiare qualcosa nelle variabili di istanza .... il main() può attendere la fine del thread e leggere tali variabili (con appositi getter magari).

    Insomma ... hai un oggetto ... sfruttalo!!


    Vuoi un banale esempio?

    codice:
    import java.math.*;
    
    public class FattorialeConcorrente {
        public static void main(String[] args) {
            try {
                Fattoriale f1 = new Fattoriale(35);
                Fattoriale f2 = new Fattoriale(73);
    
                Thread t1 = new Thread(f1);
                Thread t2 = new Thread(f2);
                t1.start();
                t2.start();
                t1.join();
                t2.join();
    
                System.out.println("Fattoriale di 35: " + f1.getRisultato());
                System.out.println("Fattoriale di 73: " + f2.getRisultato());
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    }
    
    class Fattoriale implements Runnable {
        private long valore;
        private BigInteger risultato;
    
        public Fattoriale(long valore) {
            this.valore = valore;
        }
    
        public BigInteger getRisultato() {
            return risultato;
        }
    
        public void run() {
            BigInteger n = BigInteger.ONE;
    
            for (long i = 1; i <= valore; i++) {
                n = n.multiply(BigInteger.valueOf(i));
            }
    
            risultato = n;
        }
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    213
    quindi il tup consiglio è passare i paramenti attraverso il costruttore, farli elaborare da run e farli ritornarecon un metodo gevariabile?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da terso88
    quindi il tup consiglio è passare i paramenti attraverso il costruttore, farli elaborare da run e farli ritornarecon un metodo gevariabile?
    È una possibilità .... non l'unica. Va bene se, come nel mio esempio, si richiede il risultato solo quando si è certi che il thread ha finito, in pratica se si attende la fine del thread in modo "sincrono".

    Altre soluzioni dipendono dal "quando" bisogna ottenere il risultato e da "chi" deve avere il risultato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    213
    quindi una cosa del genere potrebbe andare bene?

    codice:
    package javaapplication1;
    
    import java.io.*;
    import java.net.*;
    import java.lang.*;
    import java.util.*;
    
    class pingati implements Runnable{
        InetAddress indirizzo;
        byte[]mioip;
        int[]altroip;
        boolean x;
        Vector ipcherispondono;
        int i;
        int j;
        int k;
        int h;
        public pingati(InetAddress indirizzo,byte[]mioip,int[]altroip,boolean x,int i,int j,Vector ipcherispondono)throws Exception{
            this.indirizzo=indirizzo;
            this.mioip=mioip;
            this.altroip=altroip;
            this.x=x;
            this.ipcherispondono=ipcherispondono;
            this.i=i;
            this.j=j;
        }
        public void run(){
            for(k=i;k<j;k++){
                      for(h=0;h<256;h++){
                          altroip[2]=k;
                          altroip[3]=h;
                          mioip[0]=(byte)altroip[0];
                          mioip[1]=(byte)altroip[1];
                          mioip[2]=(byte)altroip[2];
                          mioip[3]=(byte)altroip[3];
                          try{
                            x=indirizzo.getByAddress(mioip).isReachable(5000);
                            indirizzo=InetAddress.getByAddress(mioip);
                          }
                          catch(Exception e){
                              System.out.println("errore");
                          }
                          if(x){
                              System.out.print("\n"+altroip[0]+"."+altroip[1]+"."+altroip[2]+"."+altroip[3]+" pinga");
                              ipcherispondono.add(indirizzo);
            }}}}}
    
    public class connessione{
        public static void main(String[]args)throws Exception{
    
           InetAddress indirizzo=null;
           NetworkInterface rete=null;
           byte []mioip=new byte[4];
           int[] altroip=new int[4];
           short s;
           int i;
           int j;
           boolean x=false;
           boolean y;
           String nome;
           Vector ipcherispondono= new Vector();
           Vector stampanti=new Vector();
    
           mioip=indirizzo.getLocalHost().getAddress();
           rete=NetworkInterface.getByInetAddress(indirizzo.getLocalHost());
           System.out.println(rete);
           List<InterfaceAddress> indirizzi = rete.getInterfaceAddresses();
           for (InterfaceAddress elem : indirizzi) {
               System.out.println(elem.toString());
               System.out.println(elem.getNetworkPrefixLength());
               s=elem.getNetworkPrefixLength();
               if(s==16){
               altroip[0]=(int)mioip[0];
               altroip[1]=(int)mioip[1];
               pingati p=new pingati(indirizzo,mioip,altroip,x,0,10,ipcherispondono);
               pingati q=new pingati(indirizzo,mioip,altroip,x,30,31,ipcherispondono);
               p.run();
               q.run();
    
               System.out.println("il main ha finito");
             }
         }
      }
    }

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da terso88
    quindi una cosa del genere potrebbe andare bene?
    A livello concettuale direi di sì (non ho controllato tutto per bene). Il thread scansiona un certo numero di indirizzi e per ogni indirizzo che risponde lo aggiunge in un Vector (che essendo una collezione "synchronized", è appropriato, in questo caso, per l'uso dello stesso oggetto Vector da più thread).

    Però il tuo codice a livello di stile di scrittura e a livello tecnico è praticamente un "disastro" ....

    1) Innanzitutto lo stile di scrittura .... non si capisce nulla. Indentato male, con graffe di chiusura collassate }}}}} come alla fine di pingati.

    2) Non vedo per quale motivo devi passare a pingati un InetAddress che tanto poi non usi. L'avevo sicuramente già detto: getByAddress() è un metodo statico e fare indirizzo.getByAddress(...) è fuorviante. Usa il nome della classe.
    E poi tanto ad 'indirizzo' assegni qualcosa alla riga dopo .... in pratica quello che ricevi dal costruttore non lo usi!!!

    3) La variabile 'x' non serve che sia di "istanza" (e non serve che la passi al costruttore!!!) E non devono essere di istanza nemmeno le variabili 'k' e 'h' che sono gli indici del for ... usati solo nel run().

    4) Il costruttore di pingati() non ha senso che dichiari di lanciare Exception ... non c'è nulla nel costruttore che lancia una eccezione checked!!

    5) Nel main facendo:
    codice:
               pingati p=new pingati(indirizzo,mioip,altroip,x,0,10,ipcherispondono);
               pingati q=new pingati(indirizzo,mioip,altroip,x,30,31,ipcherispondono);
               p.run();
               q.run();
    In realtà non hai fatto alcun thread e non hai alcuna "concorrenza".
    Li stai invocando tu in modo sincrono uno dopo l'altro.
    Ripeto: non stai usando dei flussi di esecuzione separati!!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    213
    ok seguirò i to ituoi consigli per rendere più leggibile il programma. alla fine ho fatto così:

    codice:
    package javaapplication1;
    import java.io.*;
    import java.lang.*;
    import java.net.*;
    import java.util.*;
    
    public class connessione{
        public synchronized static void main(String[]args)throws Exception{
            
            InetAddress indirizzo=null;
            NetworkInterface rete=null;
            byte[]mioip=new byte[4];
            int[]altroip=new int[4];
            short s;
            boolean x=false;
            Vector ipcherispondono=null;
            
           mioip=indirizzo.getLocalHost().getAddress();
           rete=NetworkInterface.getByInetAddress(indirizzo.getLocalHost());
           System.out.println(rete);
           List<InterfaceAddress> indirizzi = rete.getInterfaceAddresses();
           for (InterfaceAddress elem : indirizzi) {
               System.out.println(elem.toString());
               System.out.println(elem.getNetworkPrefixLength());
               s=elem.getNetworkPrefixLength();
               if(s==16){
                   pingati p=new pingati(indirizzo,mioip,altroip,x,ipcherispondono,0,10);
                   pingati q=new pingati(indirizzo,mioip,altroip,x,ipcherispondono,30,31);
                   p.start();
                   q.start();
                   p.join();
                   q.join();
                   System.out.println("il main ha finito");
    
    
        }
    }
        }
    }
    
    
    
    class pingati extends Thread implements Runnable{
    
        InetAddress indirizzo;
        byte[]mioip=new byte[4];
        int[]altroip=new int[4];
        boolean x;
        Vector ipcherispondono;
        int i;
        int j;
        int k;
        int h;
    
        public pingati(InetAddress indirizzo,byte []mioip,int []altroip,boolean x,Vector ipcherispondono,int i,int j){
            this.indirizzo=indirizzo;
            this.mioip=mioip;
            this.altroip=altroip;
            this.x=x;
            this.ipcherispondono=ipcherispondono;
            this.i=i;
            this.j=j;
        }
        public synchronized void run(){
            altroip[0]=(int)mioip[0];
            altroip[1]=(int)mioip[1];
                   for(k=i;k<=j;k++){
                      for(h=0;h<256;h++){
                          altroip[2]=k;
                          altroip[3]=h;
                          mioip[0]=(byte)altroip[0];
                          mioip[1]=(byte)altroip[1];
                          mioip[2]=(byte)altroip[2];
                          mioip[3]=(byte)altroip[3];
                          try{
                          x=indirizzo.getByAddress(mioip).isReachable(8000);
                          indirizzo=InetAddress.getByAddress(mioip);
                          }
                          catch(Exception e){
                              System.out.println("eccezzione");
                          }
                          if(x){
                              System.out.print("\n"+altroip[0]+"."+altroip[1]+"."+altroip[2]+"."+altroip[3]+" pinga");
                              
        } else{System.out.print("\n"+altroip[0]+"."+altroip[1]+"."+altroip[2]+"."+altroip[3]+" non pinga");}
    }}}}

    solo che l'aoutput non è corretto e non riesco a capire come mai visto che ho messo la parola chiave synchronized

    output:


    10.0.30.0 non pinga perchè 10.0.0.0 certe volte pinga e certe no?
    10.0.0.1 non pinga
    10.0.30.1 non pinga
    10.0.0.2 non pinga
    10.0.30.2 non pinga
    10.0.0.3 non pinga
    10.0.30.3 non pinga
    10.0.0.4 non pinga
    10.0.30.4 non pinga
    10.0.0.5 pinga
    10.0.0.6 non pinga
    10.0.30.5 non pinga
    10.0.0.7 non pinga
    10.0.30.6 non pinga
    10.0.0.8 non pinga
    10.0.30.7 non pinga
    10.0.0.9 non pinga dovrebbe essere 10.0.0.9 a pingare e
    10.0.30.8 pinga 10.0.30.8 a non pingare
    10.0.0.10 non pinga
    10.0.30.9 non pinga
    10.0.0.11 non pinga
    10.0.30.10 non pinga
    10.0.0.12 non pinga
    10.0.30.11 non pinga
    10.0.0.13 non pinga
    10.0.30.12 non pinga
    10.0.0.14 non pinga
    10.0.30.13 non pinga
    10.0.0.15 non pinga
    10.0.30.14 non pinga
    10.0.0.16 non pinga
    10.0.30.15 non pinga
    10.0.0.17 non pinga
    10.0.30.16 non pinga
    10.0.0.18 non pinga
    10.0.30.17 non pinga
    10.0.0.19 non pinga
    10.0.30.18 non pinga
    10.0.0.20 non pinga
    10.0.30.19 non pinga
    10.0.0.21 non pinga
    10.0.30.20 non pinga
    10.0.0.22 non pinga
    10.0.30.21 non pinga
    10.0.0.23 non pinga
    10.0.30.22 non pinga
    10.0.0.24 non pinga
    10.0.30.23 non pinga
    10.0.0.25 non pinga
    10.0.30.24 non pinga
    10.0.0.26 non pinga
    10.0.30.25 non pinga
    10.0.0.27 non pinga
    10.0.30.26 non pinga
    10.0.0.28 non pinga
    10.0.30.27 non pinga
    10.0.0.29 non pinga
    10.0.30.28 non pinga
    10.0.0.30 non pinga
    10.0.30.29 non pinga
    10.0.0.31 non pinga
    10.0.30.30 non pinga
    10.0.0.32 non pinga
    10.0.30.31 non pinga
    10.0.0.33 non pinga
    10.0.30.32 non pinga
    10.0.0.34 non pinga
    10.0.30.33 non pinga
    10.0.0.35 non pinga
    10.0.30.34 non pinga
    10.0.0.36 non pinga
    10.0.30.35 non pinga
    10.0.0.37 non pinga
    10.0.30.36 non pinga
    10.0.0.38 non pinga



    oltretutto non mi sembra di aver guadagnato chissà cosa in termini di prestazioni

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Non ci siamo .....

    1) Il synchronized sul main() non ha alcun senso e non serve.

    2) Il synchronized sul run() non serve. Hai 2 istanze di pingati, quindi ognuno dei thread acquisisce il lock sul suo oggetto pingati .... e non ti cambia nulla.

    3) Continui ad usare cose che non servono ... variabili di istanza, parametri.

    4) Non serve per pingati dichiarare implements Runnable. Già Thread è Runnable.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.