Nel mio allargare l'orizzonte di java mi sto imbattendo nei problemi di concorrenza dei thread. Ho creato una semplice applicazione che rappresenta 3 cronometri. Uno stampa il tempo ogni secondo, uno ogni 2 e uno ogni 3. Dell'output me ne frego perchè non è il mio attuale scopo..
Ho notato che sbaglia il tempo quando stampa nel caso dei 2 o 3 secondi. Ok, si legge che non sempre in un metodo sleep si può avere la precisione, ma nel mio caso ad un certo punto sbaglia anticipando! Non vorrei che ci fossero problemi nel mio codice.
Queste sono le classi
Codice:
public class Orologio implements Runnable
{
private int secondi = 0;
public void setSecondi()
{
secondi++;
}
public int getSecondi()
{
return secondi;
}
@Override
public void run()
{
while(true)
{
System.out.println(this.getSecondi());
try
{
Thread.sleep(1000);
}
catch(InterruptedException e){}
this.setSecondi();
}
}
}
Codice:
public class Temporizzatore implements Runnable
{
private int secondi;
private String nome;
private Orologio o;
public Temporizzatore(int secondi, String nome, Orologio o)
{
this.secondi = secondi;
this.nome= nome;
this.o = o;
}
@Override
public void run()
{
while(true)
{
System.out.println(nome+" "+o.getSecondi());
try
{
Thread.sleep(secondi*1000);
}
catch(InterruptedException e){}
}
}
}
Codice:
public class Main
{
/**
* @param args
*/
public static void main(String[] args)
{
Orologio o = new Orologio();
Thread orologio = new Thread(o);
Thread t1 = new Thread(new Temporizzatore(1, "Primo cronometro", o));
Thread t2 = new Thread(new Temporizzatore(2, "Secondo cronometro", o));
Thread t3 = new Thread(new Temporizzatore(3, "terzo cronometro", o));
orologio.start();
t1.start();
t2.start();
t3.start();
}
}