Newsgroup: it.comp.java
Titolo: Semafori e multithreading

Sto provando ad impratichirmi con l'argomento provando a sperimentare 
senza usare il metodo synchronized,ma una classe Semaforo presa da 
alcuni appunti.
Siccome sono un novellino alle prime armi, probabilmente sto facendo 
qualche  errore banalissimo...
 
Ecco il codice:
 
class Tsum implements Runnable{
static int n=0;
private int a=1;
Semaphore s;
Thread t;
 
public Tsum(String n,Semaphore s){
t=new Thread(this, n);
t.start();
}
 
public void run(){s.down();  n=n+a; System.out.println("Somma del " + 
t.getName() + " thread n: " + n);
s.up();
 
}
 
 
}
 
 
public class Somma{
 
public static void main(String args[]){
 
Tsum t1,t2,t3,t4;
Semaphore s=new Semaphore(1);
t1=new Tsum("Primo",s);
t2=new Tsum("Secondo",s);
t3=new Tsum("Terzo",s);
t4=new Tsum("Quarto",s);
  }
 
}
 
 
 
 
 
public class Semaphore {
private int value, sospesi;
  public Semaphore (int v){
  value=v; sospesi=0;
  }
 
 
  public synchronized void down (){
   if (value==0) {
   sospesi++;
   try { wait();}
   catch (InterruptedException e) {}
   sospesi--;
   }
   else {
   value--;
   }
  }
  public synchronized void up () {
   if (sospesi>0){
   notify();
   }
   else{
   value++;}
}
 
}
 
 
 
 
Il codice compila, ma ricevo questi errori in fase di esecuzione:
 
java Somma
Exception in thread "Primo" Exception in thread "Secondo" Exception in 
thread "Terzo" Exception in thread "Quarto" 
java.lang.NullPointerException 
 
         at Tsum.run(Somma.java:12) 
 
 
         at java.lang.Thread.run(Thread.java:744) 
 
 
java.lang.NullPointerException 
 
 
         at Tsum.run(Somma.java:12) 
 
 
         at java.lang.Thread.run(Thread.java:744) 
 
 
java.lang.NullPointerException
         at Tsum.run(Somma.java:12)
         at java.lang.Thread.run(Thread.java:744)
java.lang.NullPointerException
         at Tsum.run(Somma.java:12)
         at java.lang.Thread.run(Thread.java:744)
massimo@debian:~$ java Somma
Exception in thread "Primo" Exception in thread "Secondo" Exception in 
thread "Terzo" java.lang.NullPointerException
         at Tsum.run(Somma.java:12)
         at java.lang.Thread.run(Thread.java:744)
java.lang.NullPointerException
         at Tsum.run(Somma.java:12)
         at java.lang.Thread.run(Thread.java:744)
java.lang.NullPointerException
         at Tsum.run(Somma.java:12)
         at java.lang.Thread.run(Thread.java:744)
Exception in thread "Quarto" java.lang.NullPointerException
         at Tsum.run(Somma.java:12)
         at java.lang.Thread.run(Thread.java:744)
 
 
 
 
 
Qualcuno pu� aiutarmi?
Grazie!

 Grazie!
 
il compilatore ti dice esattamente dove c'e' l'errore: alla riga 12 di
Somma.java e riguarda probabilmente il metodo run di TSum.
Cosi a occhio una degli oggetti/variabili che vuoi fargli usare in run()
e' null (non e' istanziata).
 
Ciao Jack
-- 
Yoda of Borg am I! Assimilated shall you be! Futile resistance is, hmm?

 }
[...]
direi che nel costruttore manchi
this.s = s;
 

 this.s = s;
 
 
Grazie ad entrambi, ragazzi.
 
Quando si è alle prime armi la confusione ti porta a non riuscire a 
vedere le cose più banali...col tempo migliorerò! ;-)

 e' null (non e' istanziata).
 
E' sempre il solito semaforo che non ho inizializzato nel costruttore 
dimenticando di passare this.s=s per "attaccare" ad ogni thread il 
semaforo condiviso.
 


Cmq non solo non avevo passato il semaforo, ma anche "String n" era 
rimasta appesa senza una variabile della classe a memorizzarla...
Adesso compila.

 rimasta appesa senza una variabile della classe a memorizzarla...
 
fa nulla. non e' obbligatorio. String n la passi direttamente a Thread e
quindi va bene.
 
Cmq consiglio: nomina in modo un po' migliore le variabili: hai ad
esempio una variabile static int n (che usi in run()) e nel costruttore
hai una "n" (String) locale. E' facile fare confusione.


 hai una "n" (String) locale. E' facile fare confusione.
 
Hai ragione, e se stessi scrivendo codice seriamente lo avrei gi� fatto, 
ma essendo solo esperimenti fatti in fretta cercando di capire i 
costrutti ho buttato lettere a casaccio :-)
 
Per� l'indentazione non � proprio da buttare almeno :-P