Java模拟三个老师同时给50个小朋友发苹果,每个老师相当于一个线程
时间: 2024-12-18 08:24:07 浏览: 5
在Java中,我们可以使用多线程和并发集合来模拟这个场景。每个老师可以看作是一个独立的线程,而50个小朋友可以看作是并发队列(如`BlockingQueue`),代表了资源的有限性和并发访问的需求。以下是简化的步骤:
1. **创建线程类** (TeacherThread): 定义一个TeacherThread类,它继承自Thread类,并实现一个方法如`giveApples()`,在这个方法中负责分配苹果。
```java
class TeacherThread extends Thread {
private int apples;
public TeacherThread(int apples) {
this.apples = apples;
}
public void run() {
while (!isStopped()) {
if (queue.isEmpty()) {
// 如果苹果耗尽或队列为空,则等待
try {
queue.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 发放苹果
giveApples(queue);
}
}
protected synchronized void giveApples(Queue<Integer> queue) {
if (queue.size() > 0) {
queue.poll(); // 从队列中取出一个苹果
System.out.println("Teacher " + getName() + " gave an apple to a student.");
}
}
}
```
2. **创建并发队列** (BlockingQueue): 使用`ArrayBlockingQueue`或`LinkedBlockingQueue`来存储苹果。
```java
import java.util.concurrent.BlockingQueue;
BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(50); // 初始化50个苹果
// 假设我们有三位老师
TeacherThread teacher1 = new TeacherThread(20);
TeacherThread teacher2 = new TeacherThread(15);
TeacherThread teacher3 = new TeacherThread(15);
3. **启动线程**:
将老师线程添加到一组线程组中并开始运行。
```java
List<Thread> teachers = Arrays.asList(teacher1, teacher2, teacher3);
for (TeacherThread teacher : teachers) {
teacher.start();
}
4. **控制停止**:
当需要结束这个场景时,可以在某个地方设置一个标志,让所有教师线程检查`isStopped()`并退出循环。
```java
public boolean isStopped() {
return !shouldContinue; // 根据需要设置这个标志
}
阅读全文