Bạn có thể sử dụng các biến khóa "a" và "b" và đồng bộ hóa chúng để khóa "phần quan trọng" theo thứ tự ngược lại. Ví dụ. Thông báo "a" rồi Khóa "b", "IN", Thông báo "b" rồi Khóa "a".
Vui lòng tham khảo các mã dưới đây: -
public class EvenOdd {
static int a = 0;
public static void main(String[] args) {
EvenOdd eo = new EvenOdd();
A aobj = eo.new A();
B bobj = eo.new B();
aobj.a = Lock.lock1;
aobj.b = Lock.lock2;
bobj.a = Lock.lock2;
bobj.b = Lock.lock1;
Thread t1 = new Thread(aobj);
Thread t2 = new Thread(bobj);
t1.start();
t2.start();
}
static class Lock {
final static Object lock1 = new Object();
final static Object lock2 = new Object();
}
class A implements Runnable {
Object a;
Object b;
public void run() {
while (EvenOdd.a < 10) {
try {
System.out.println(++EvenOdd.a + " A ");
synchronized (a) {
a.notify();
}
synchronized (b) {
b.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class B implements Runnable {
Object a;
Object b;
public void run() {
while (EvenOdd.a < 10) {
try {
synchronized (b) {
b.wait();
System.out.println(++EvenOdd.a + " B ");
}
synchronized (a) {
a.notify();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
OUTPUT: - 1 Một 2 B 3 Một 4 B 5 A 6 B 7 Một 8 B 9 A 10 B
Cảm ơn bạn đã trả lời nhưng bạn sẽ như thế nào tham khảo "cờ" từ bên trong T1, ví dụ? Tôi đã thử một cái gì đó như ParentClass.flag (nơi ParentClass là lớp mà từ đó tôi bắt đầu "chính" và "trợ giúp") và nó dường như không hoạt động ... – user1031431
Khởi tạo T1/T2 với tham chiếu đến lớp chứa của chúng và làm cho lá cờ trở thành thành viên của lớp đó? –