package com.blithe;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockDemo {
private static ReentrantLock lock = new ReentrantLock();
private static Condition cA = lock.newCondition();
private static Condition cB = lock.newCondition();
private static Condition cC = lock.newCondition();
private static CountDownLatch lB = new CountDownLatch(1);
private static CountDownLatch lC = new CountDownLatch(1);
/**
* 存在三个线程cA、cB、cC,三个线程依次打印A、B、C,要求依次输出结果ABCABC
* @param args
*/
public static void main(String[] args) {
new Thread(() ->{
lock.lock();
try {
for (int i = 0; i < 10; i++) {
cB.signal();
System.out.print("A");
// 保证线程执行顺序,由A线程先进行执行
if (i == 0) lB.countDown();
// 阻塞当前线程
cA.await();
}
// 保证在所有的程序执行结束的时候,线程不处于await状态
cB.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}, "threadA").start();
new Thread(() ->{
try {
// 确保如果线程B先执行,则线程进入阻塞状态
lB.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
lock.lock();
try {
for (int i = 0; i < 10; i++) {
cC.signal();
System.out.print("B");
if (i == 0) lC.countDown();
cB.await();
}
cC.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}, "threadB").start();
new Thread(() ->{
try {
lC.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
lock.lock();
try {
for (int i = 0; i < 10; i++) {
cA.signal();
System.out.print("C");
cC.await();
}
cA.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}, "threadC").start();
}
}
Java如何实现线程排序问题
于 2023-02-03 16:30:31 首次发布