方法一:ReentrantLock+Condition
public static void method1() {
ReentrantLock lock = new ReentrantLock();
Condition condA = lock.newCondition();
Condition condB = lock.newCondition();
Condition condC = lock.newCondition();
new Thread(() -> {
while (true) {
lock.lock();
try {
condB.signal();
System.out.println("A");
Thread.sleep(1000);
condA.await();
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
lock.unlock();
}
}
}).start();
new Thread(() -> {
while (true) {
lock.lock();
try {
condC.signal();
System.out.println("B");
Thread.sleep(1000);
condB.await();
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
lock.unlock();
}
}
}).start();
new Thread(() -> {
while (true) {
lock.lock();
try {
condA.signal();
System.out.println("C");
Thread.sleep(1000);
condC.await();
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
lock.unlock();
}
}
}).start();
}
方法二:synchronized
public static void method2() {
Object lock = new Object();
new Thread(() -> {
while (true) {
synchronized (lock) {
while (state != 1) {
try {
lock.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
System.out.println("A");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
state = 2;
lock.notifyAll();
}
}
}).start();
new Thread(() -> {
while (true) {
synchronized (lock) {
while (state != 2) {
try {
lock.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
System.out.println("B");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
state = 3;
lock.notifyAll();
}
}
}).start();
new Thread(() -> {
while (true) {
synchronized (lock) {
while (state != 3) {
try {
lock.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
System.out.println("C");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
state = 1;
lock.notifyAll();
}
}
}).start();
}
方法三:Semaphore
public static void method3() {
Semaphore semaphoreA = new Semaphore(1);
Semaphore semaphoreB = new Semaphore(0);
Semaphore semaphoreC = new Semaphore(0);
new Thread(() -> {
while (true){
try {
semaphoreA.acquire();
System.out.println("A");
Thread.sleep(1000);
semaphoreB.release();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}).start();
new Thread(() -> {
while (true){
try {
semaphoreB.acquire();
System.out.println("B");
Thread.sleep(1000);
semaphoreC.release();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}).start();
new Thread(() -> {
while (true){
try {
semaphoreC.acquire();
System.out.println("C");
Thread.sleep(1000);
semaphoreA.release();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}).start();
}