Il est 3h30 du matin ici et je veux aller dormir. C'est ce que je suis venu avec:
class TurnHolder {
private volatile int currentTurn;
public void setNextTurn() {
this.currentTurn = currentTurn^1;
}
public int getCurrentTurn() {
return currentTurn;
}
}
class Printer implements Runnable {
private String toPrint;
private TurnHolder sharedResource;
private int turn;
Printer(String toPrint, TurnHolder sharedResource, int turn) {
this.toPrint = toPrint;
this.sharedResource = sharedResource;
this.turn = turn;
}
@Override
public void run() {
while (true) {
synchronized (sharedResource) {
if (sharedResource.getCurrentTurn() != turn)
try {
sharedResource.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(toPrint);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
sharedResource.setNextTurn();
sharedResource.notifyAll();
}
}
}
Une façon de l'exécuter est:
TurnHolder sharedResource = new TurnHolder();
Printer printerA = new Printer("a", sharedResource, 0);
Printer printerB = new Printer("b", sharedResource, 1);
new Thread(printerA).start();
new Thread(printerB).start();
De cette façon, votre sharedResource
gardera la mémoire du tour et la synchronisation sur elle vous permet de faire ce que vous avoir à faire avec ce tour, puis vous pouvez changer de tour. Le Thread.sleep
est juste pour vous laisser voir l'impression à une bonne vitesse. printThreadOutput();
P.S .: suggestion sur la façon d'améliorer le code sont les bienvenus.
'while (tour! = Tourner)'? –
'synchronized' devrait résoudre le non-det –
Votre code contient des onglets mixtes et des espaces pour l'indentation - c'est une mauvaise idée. Vous devez vous assurer d'utiliser des onglets ou des espaces de manière cohérente. – thejh