PDA

View Full Version : [JAVA] thread: start contemporaneo


draghe
29-06-2009, 18:17
mi spiego meglio. io ho già esteso la classe Thread e modificato il metodo tun in modoc he fa quello che voglio io.
nella classe Test dove ho il main ho creato e fatto partire i tre processi

new Thread("nomeThread1").start();
new Thread("nomeThread2").start();

il problema è che questi tre processi non partono in contemporanea... (almeno così so io)

è l'esercizio mi chiede di implementare un abitro coordina l'inizio del gioco garantendo che i giocatori possano iniziare il gioco contemporaneamente

fero86
29-06-2009, 19:36
new Thread("nomeThread1").start();
new Thread("nomeThread2").start(); codice inutile, il metodo run della classe Thread non fa niente. non é Thread che devi istanziare, ma la tua sottoclasse.


il problema è che questi tre processi non partono in contemporanea... (almeno così so io)

è l'esercizio mi chiede di implementare un abitro coordina l'inizio del gioco garantendo che i giocatori possano iniziare il gioco contemporaneamente blocca entrambi i thread su un oggetto con Object.wait e sbloccali contemporaneamente con Object.notifyAll (sullo stesso oggetto naturalmente). ricordati di gestire appropriatamente le condizioni di spurious wakeup.

PGI-Bis
29-06-2009, 21:16
Usa una barriera (java.util.concurrent.CyclicBarrier).

fero86
30-06-2009, 19:33
Usa una barriera (java.util.concurrent.CyclicBarrier). effettivamente questa via é preferibile rispetto al sistema che ho suggerito io, il quale richiede piu lavoro perché oltre alla gestione degli spurious wakeups bisogna anche stare attenti all'eventualitá che notifyAll venga chiamata prima che entrambi i thread si siano bloccati sulla wait.

fero86
30-06-2009, 19:36
ad esempio, questa soluzione é errata:

final Object start = new Object();
volatile boolean starting = false;

.
.
.

new Thread("Thread1") {
@Override
public void run()
{
synchronized (start)
{
while (!starting)
{
start.wait();
}
}
}
}.start();

new Thread("Thread2") {
@Override
public void run()
{
synchronized (start)
{
while (!starting)
{
start.wait();
}
}
}
}.start();

starting = true;
start.notifyAll();

meglio la barriera.