接力排序怎么编程

时间:2025-01-24 23:13:17 网络游戏

接力排序通常是指线程之间的协作,其中一个线程完成其任务后,通知下一个线程开始执行。下面是一个使用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的线程和条件变量来实现接力排序。你可以根据需要调整打印次数和循环次数。