se hai la pazienza di leggere il mio codice, a dire la verità ne ho una decina di versioni (purtroppo non funzionanti). Ti posto l'ultima...non credevo fosse la strada più semplice per chi può aiutarmi (purtroppo non so individuare dove sono i punti critici ). Grazie della disponibilità.

public class Partecipante implements Runnable{
public Partecipante(String nome)
{
this.nome=nome;
this.punteggio=0;

}

public void aumentaPunteggio()
{
this.punteggio++;
}

public int getPunteggio()
{
return this.punteggio;
}

public String getNome()
{
return this.nome;
}
//il metodo che deve essere sovrascritto
public void run()
{ int nPart=Test.numPartecipanti;
try{
wait();
for(int i=0;i<nPart;i++)
{
Sedie[i].occupaSedia(this);
}

}
catch(InterruptedException e)
{ return; }
}

public String nome;
public int punteggio;
}
public class Sedia {
public Sedia()
{
this.occupata=false;
this.occupante=new Partecipante(String nomePartecipante);
}
public boolean getStatoSedia()
{
return this.occupata;
}
public synchronized void occupaSedia(Partecipante occupante)
{
if((numeroSedie>0)&&(!this.occupata))
{
numeroSedie--;
this.occupata=true;
this.occupante=occupante;
System.out.println("Il giocatore"+occupante.getNome()+"ha occupato una Sedia");
occupante.aumentaPunteggio();
System.out.println("ha il seguente punteggio: "+occupante.getPunteggio());
}
else
System.out.println("Non ci sono sedie da occupare");
System.out.println("il giocatore"+occupante.getNome()+"è rimasto in piedi");
}
public void liberaSedia()
{
this.occupata=false;
}
public String getNomeOccupante()
{
return this.occupante.getNome();
}
public boolean occupata;
public Partecipante occupante;
static int numeroSedie=Test.numSedie;
}
import java.io.*;

public class Test {

public static void main(String[] args)throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Inserisci un istanza del gioco - N. Sedie, N. Partecipanti, N. Sessioni: ");

String scelta=br.readLine();
numSedie=Integer.parseInt(scelta);

String scelta2=br.readLine();
numPartecipanti=Integer.parseInt(scelta2);

String scelta3=br.readLine();
numSessioni=Integer.parseInt(scelta3);

System.out.println("n. sedie:"+numSedie+" n. Partecipanti:"+numPartecipanti+" n. Sessioni:"+numSessioni);

//inizializzo le sedie
Sedia[] sedie=new Sedia[numSedie];
for(int i=0;i<numSedie;i++)
sedie[i]=new Sedia();

//inizializzo i partecipanti
Partecipante[] partecipanti= new Partecipante[numPartecipanti];
for(int i=0;i<numPartecipanti;i++)
Thread partecipanti[i]= new Partecipante("partecipante"+i);

for(int i=0;i<=numSessioni;i++)
{
new Thread(partecipanti[i]).start();
sedie[i].liberaSedia();
partecipanti.notifyAll();
//join();
}
//System.out.println("Statistica:");
//for(int i=0;i<=numPartecipanti;i++)
// System.out.println("Il giocatore ");

}

public static int numPartecipanti;
public static int numSedie;
public static int numSessioni;
}