接力排序通常是指线程之间的协作,其中一个线程完成其任务后,通知下一个线程开始执行。下面是一个使用Java编写的接力排序的示例,其中三个线程A、B、C按顺序打印不同次数的数字:
```java
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ShareResource {
private int number = 1; // 标识位
private Lock lock = new ReentrantLock();
private Condition condition1 = lock.newCondition();
private Condition condition2 = lock.newCondition();
private Condition condition3 = lock.newCondition();
public void printA(int totalLoop) throws InterruptedException {
lock.lock();
try {
while (number != 1) {
condition1.await();
}
for (int i = 1; i <= 5; i++) {
System.out.println("A");
}
number = 2;
condition2.signal();
} finally {
lock.unlock();
}
}
public void printB(int totalLoop) throws InterruptedException {
lock.lock();
try {
while (number != 2) {
condition2.await();
}
for (int i = 1; i <= 10; i++) {
System.out.println("B");
}
number = 3;
condition3.signal();
} finally {
lock.unlock();
}
}
public void printC(int totalLoop) throws InterruptedException {
lock.lock();
try {
while (number != 3) {
condition3.await();
}
for (int i = 1; i <= 15; i++) {
System.out.println("C");
}
number = 1;
condition1.signal();
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
ShareResource shareResource = new ShareResource();
Thread threadA = new Thread(() -> {
try {
for (int i = 0; i < 20; i++) {
shareResource.printA(20);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
Thread threadB = new Thread(() -> {
try {
for (int i = 0; i < 20; i++) {
shareResource.printB(20);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
Thread threadC = new Thread(() -> {
try {
for (int i = 0; i < 20; i++) {
shareResource.printC(20);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
threadA.start();
threadB.start();
threadC.start();
}
}
```
代码解释
标识位 :`number`变量用于标识当前应该执行哪个线程的任务。锁:
`lock`对象用于确保线程安全。
条件变量:
`condition1`、`condition2`、`condition3`用于线程间的通信,当一个线程完成任务后,它会唤醒等待的线程。
打印方法
`printA`:当`number`为1时,打印5次"A",然后将`number`设置为2,并唤醒等待的线程`condition2`。
`printB`:当`number`为2时,打印10次"B",然后将`number`设置为3,并唤醒等待的线程`condition3`。
`printC`:当`number`为3时,打印15次"C",然后将`number`设置为1,并唤醒等待的线程`condition1`。
主方法:
创建并启动三个线程,每个线程循环20次执行打印任务。
这个示例展示了如何使用Java的线程和条件变量来实现接力排序。你可以根据需要调整打印次数和循环次数。