线程按序交替执行案例
-
要求:
编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。
如:ABCABCABC…… 依次递归
-
代码实现:
- 使用
Lock
锁 - 使用
Condition
控制线程通信
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class TestDemo { public static void main(String[] args) { PrintABC printABC = new PrintABC(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { printABC.printA(); } } }, "A").start(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { printABC.printB(); } } }, "B").start(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { printABC.printC(); } } }, "C").start(); } } class PrintABC { private char mark = 'A'; // 标记当前执行的线程 private Lock lock = new ReentrantLock(); private Condition conditionA = lock.newCondition(); private Condition conditionB = lock.newCondition(); private Condition conditionC = lock.newCondition(); public void printA() { lock.lock(); try { if (mark != 'A') { try { // 阻塞A线程 conditionA.await(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.print(Thread.currentThread().getName()); // 唤醒B线程 mark = 'B'; conditionB.signal(); } finally { lock.unlock(); } } public void printB() { lock.lock(); try { if (mark != 'B') { try { // 阻塞B线程 conditionB.await(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.print(Thread.currentThread().getName()); // 唤醒C线程 mark = 'C'; conditionC.signal(); } finally { lock.unlock(); } } public void printC() { lock.lock(); try { if (mark != 'C') { try { // 阻塞C线程 conditionC.await(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.print(Thread.currentThread().getName()); // 唤醒A线程 mark = 'A'; conditionA.signal(); } finally { lock.unlock(); } } }
- 使用