Newsgroup: it.comp.java
Titolo: [niubbo] problema con i thread

Ciao a tutti, ho un problema con i thread.
ho copiato dal libro di mokabyte il codice di base che usa i thread, e
poi l'ho modificato per inserire i synchronized.
Questo codice semplicemente lancia due thread che incrementano 100
volte ciascuno un int contenuto dentro un oggetto passato ai due
thread dal programma principale.
il risultato finale dovrebbe essere 200, e invece viene fuori 100.
la cosa strana e' che se in qualche punto del programma (vedere i
commenti) inserisco un "ritardo", tipo una sleep o un ciclo che per
100 volte stampa a video l'oggetto incrementato, funziona a dovere.
o meglio, in quest'ultimo caso le prime 20-30 stampe scrive 100, le
seguenti 200. Non riesco a capire dov'e' il problema. allego i 3 file:
Grazie per l'aiuto! :)
 
 
ProvaThread.java
package provaThread;
 
import java.io.BufferedReader;
import java.io.FileReader;
import java.net.*;
 
public class ProvaThread2
    {
 
   public static void main(String[] args)
      {
      IntT giri=new IntT();
 
      Thr2 thr1=new Thr2(giri);
      Thr2 thr2=new Thr2(giri);
 
      thr1.start();
      thr2.start();
//      try {Thread.sleep(1000);}
//      catch (Exception E){}
 
        for (int i=0; i<100;i++)
            {
            System.out.println("->"+giri.get());
            }
      }
   }
 
 
Thr2.java
package provaThread;
 
public class Thr2 implements Runnable
    {
    IntT intProva;
    private Thread threadCorr=null;
 
    public Thr2(IntT id)
        {
        intProva=id;
        }
 
    public void run()
                {
        for (int i=0;i<100;i++)
            {
            intProva.add();
//            System.out.println(intProva.get());
            }
    public void start()
        {
        threadCorr=new Thread(this);
        threadCorr.start();
        }
    }
 
IntT.java
 
package provaThread;
 
public class IntT
    {
    private int T=0;
 
    public synchronized void add()
        {
        T++;
        }
 
    public synchronized int get()
        {
        return T;
        }
 
    }
 
 
-- 
Be you!
www.shareyourproblems.org
 
 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it
 
 
 

 il risultato finale dovrebbe essere 200, e invece viene fuori 100.
 
Hai lanciato i due thread: questi vengono eseguiti parallelamente tra 
loro e in parallelo anche al thread che esegue il main. Dato che nel 
main non attendi in alcun modo che abbiano finito il loro lavoro 
(potresti farlo usando il metodo join su entrambi) quello che vedi � un 
risultato intermedio che devi considerare del tutto indeterministico 
visto che non c'� modo di sapere quando e a che velocit� girano i 
thread. Quando aggiungi l'attesa semplicemente gli dai il tempo di fare 
quello che devono e ottieni il risultato che ti aspetti.
 
-- 
r--r--r--

 quello che devono e ottieni il risultato che ti aspetti.
 
il join lo sapevo come metodo, ma negli esempi del libro non lo usa,
lancia due thread che contano fino a 100 ma senza aspettare nulla.
 
ed e' possibile fare il join su due thread, in modo che il thread
principale aspetti che finiscano tutti e due?


 principale aspetti che finiscano tutti e due?
 
Certo! puoi mettere ad esempio
 
thr1.join();
thr2.join();
 
prima di stampare i risultati. In questo caso il thread del main 
attenderà prima che termini thr1 (oppure passerà oltre se è già 
terminato) e poi il 2 prima di procedere.
 
Ovviamente se vuoi stampare a video quello che fanno thr1 e 2 non puoi 
farlo nel main se questo è bloccato ad attendere il loro termine, in 
questo caso dovresti creare un terzo thread che periodicamente stampa la 
situazione e che gira insieme ai primi due.
 
Se però vuoi "vedere" i thread che lavorano è meglio che gli fai fare 
qualcosa di più oneroso, come hai notato il tuo programma stampa 100 o 
200 a seconda dei casi, indice che l'esecuzione è talmente breve che il 
primo thread ha già finito prima che riesca a partire il secondo.
 
 

Gentilissimo!
