我有 Cell class 表示单个值和 swapThread类,其run方法只调用Cell中的方法 swapValue()。 / p>
public static void main(String[] args) throws InterruptedException {
Cell c1 = new Cell(15);
Cell c2 = new Cell(23);
Thread t1 = new swapThread(c1, c2);
Thread t2 = new swapThread(c2, c1);
t1.start();
t2.start();
}
类Cell :
class Cell {
private static int counter = 0;
private int value, id;
public Cell(int v) {
value = v;
id = counter++;
}
synchronized int getValue() {
return value;
}
synchronized void setValue(int v) {
value = v;
}
void swapValue(Cell other) {
int t = getValue();
System.out.println("Swapping " + t);
int v = other.getValue();
System.out.println("with " + v);
setValue(v);
other.setValue(t);
System.out.println("Cell is now " + getValue());
System.out.println("Cell was " + other.getValue());
}
}
和类swapThread :
class swapThread extends Thread {
Cell cell, othercell;
public swapThread(Cell c, Cell oc) {
cell = c;
othercell = oc;
}
public void run() {
cell.swapValue(othercell);
}
}
常用输出:
Swapping 15
Swapping 23
with 23
with 15
Cell is now 23
Cell is now 15
Cell was 15
Cell was 23
我可以等待thread1在main方法中以 Thread.join()结束,但有办法通过更改同步方法来避免这种情况。
答案 0 :(得分:1)
通过使此方法静态和同步,您可以实现swapValues()
的串行执行:
static synchronized void swapValues(Cell c1, Cell c2) {
int t = c1.getValue();
System.out.println("Swapping " + t);
int v = c2.getValue();
System.out.println("with " + v);
c1.setValue(v);
c2.setValue(t);
System.out.println("Cell is now " + c1.getValue());
System.out.println("Cell was " + c2.getValue());
}
因此,您可以在Cell.class
上同步它,使swapValues()
按顺序执行。
注意,现在你需要传递2个单元格:
public void run() {
Cell.swapValues(cell, othercell);
}