有三个线程,线程1负责生产超级兵,线程2负责超级兵移动,线程3攻击防御塔,必须要按给定顺序,依次执行5次。
时间: 2024-09-17 15:01:55 浏览: 32
要按照给定顺序,即先生产超级兵,然后让超级兵移动,最后由线程3攻击防御塔,你可以使用Java的`synchronized`关键字和`wait()`/`notifyAll()`方法来实现线程同步。这里是一个简单的例子,假设有一个`SuperSoldier`类代表超级兵,和一个`Tower`类代表防御塔,以及一个`TaskQueue`用于存储任务:
```java
import java.util.concurrent.*;
class SuperSoldier {
private boolean ready = false;
synchronized void produce() {
while (!ready) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 生产超级兵的逻辑...
ready = false; // 设置完成标志
notifyAll(); // 唤醒其他等待的线程
}
// 添加其他方法,如move等
}
class Tower {
// 攻击逻辑...
}
class Worker implements Runnable {
private final SuperSoldier soldier;
private final Tower tower;
private static int count = 0;
public Worker(SuperSoldier soldier, Tower tower) {
this.soldier = soldier;
this.tower = tower;
}
@Override
public void run() {
for (int i = 0; i < 5; i++) {
if (i == 0) { // 第一次执行生产
soldier.produce();
} else if (i == 1) { // 第二次执行移动
soldier.move();
} else if (i == 4) { // 第五次执行攻击
tower.attack(soldier); // 假设soldier有attack方法
}
try {
Thread.sleep(1000); // 模拟任务执行时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Main {
public static void main(String[] args) {
SuperSoldier soldier = new SuperSoldier();
Tower tower = new Tower();
ExecutorService executor = Executors.newFixedThreadPool(3);
Worker worker1 = new Worker(soldier, tower);
Worker worker2 = new Worker(soldier, tower);
Worker worker3 = new Worker(null, tower); // 线程3不需要士兵
executor.execute(worker1);
executor.execute(worker2);
executor.execute(worker3);
// 控制线程顺序执行
while (!count >= 5) {
Thread.sleep(100); // 每隔一段时间检查是否完成
}
executor.shutdown();
}
}
阅读全文