Java实现果园里的苹果成熟了,两位果农同时分别采摘5棵苹果树,模拟采摘一棵苹果树的时间间隔是1秒,输出两位果农的采摘进度。要求使用多线程知识实现。
时间: 2024-12-25 09:35:53 浏览: 3
在Java中,我们可以使用并发编程的知识,特别是`Thread`和`synchronized`关键字来实现这个场景。首先,创建两个线程代表两位果农,每个线程都负责采摘一棵苹果树。由于我们想要模拟时间间隔,可以使用`Thread.sleep(1000)`让线程暂停1秒。
```java
import java.util.concurrent.atomic.AtomicInteger;
class AppleTree {
private AtomicInteger apples = new AtomicInteger(); // 树上的苹果数量
public void pickApple() {
if (apples.getAndDecrement() > 0) { // 如果还有苹果,减少并打印进度
System.out.println(Thread.currentThread().getName() + " picked an apple from tree with " + apples.get() + " left.");
} else {
System.out.println(Thread.currentThread().getName() + " finished picking the tree.");
}
}
}
public class Orchard implements Runnable {
private static final int NUM_APPLE_TREES = 5;
private static final int THREADS = 2; // 果农数量
private final AppleTree[] trees = new AppleTree[NUM_APPLE_TREES];
@Override
public void run() {
for (int i = 0; i < THREADS; i++) {
Thread thread = new Thread(() -> {
int startingTreeIndex = i * NUM_APPLE_TREES / THREADS; // 计算起始树位置
for (int j = 0; j < NUM_APPLE_TREES; j++) {
trees[startingTreeIndex + j].pickApple();
try {
Thread.sleep(1000); // 模拟每棵树采摘间隔1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "Farmer" + (i + 1));
thread.start();
}
}
public static void main(String[] args) {
new Orchard().run();
}
}
```
在这个例子中,我们首先初始化一些苹果树,然后为每个果农创建一个线程。在每个线程内部,他们依次采摘每一棵树,并确保每次只有一位果农操作同一棵树,防止竞态条件。通过`AtomicInteger`保证对苹果数量的操作是原子性的。
阅读全文