现在是凌晨 3.30 点,我想睡觉。这就是我想出的:
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();
}
}
}
运行它的一种方法是:
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();
这样,您sharedResource
将保留转弯的记忆并在其上进行同步,这样您就可以做与该转弯有关的事情,然后您可以切换转弯。这Thread.sleep
只是为了让您以不错的速度看到打印。这System.out.println(toPrint);
是你的printThreadOutput();
PS:欢迎提出如何改进代码的建议。