教学楼的教室设计都有前后门,学生上课时均可以从前后门进入教室。假设某老师的教学班共有55人,某天上课时某老师想清点从前后门进入教室上课的学生人数,而学生从前后门进入教室是随机的。用Java请你利用接口Runnable编写线程程序,模拟学生从教室的前后门进入教室,并统计前后门进入的学生人数。
时间: 2024-03-02 19:52:04 浏览: 153
好的,我来为你解答这个问题。
首先,我们需要定义一个接口`Runnable`,并在其中实现学生进入教室的逻辑。具体实现如下:
```java
public interface EntranceRunnable extends Runnable {
void run(int entranceId);
}
```
其中,`run`方法负责模拟学生进入教室的过程,`entranceId`表示学生进入教室的门的编号(前门为0,后门为1)。
接下来,我们定义一个实现了`EntranceRunnable`接口的类`Student`,并在其中实现`run`方法的逻辑。具体实现如下:
```java
public class Student implements EntranceRunnable {
private static int total = 0; // 进入教室的学生总数
private int entranceId; // 进入教室的门的编号
@Override
public void run(int entranceId) {
synchronized (Student.class) {
// 统计进入教室的学生总数
total++;
}
// 进入教室
System.out.println("Entrance " + entranceId + ": Student " + Thread.currentThread().getId() + " entered the classroom.");
}
public static int getTotal() {
return total;
}
}
```
其中,`total`表示进入教室的学生总数,`entranceId`表示进入教室的门的编号。在`run`方法中,我们使用`synchronized`关键字保证了`total`的线程安全性,避免了多个线程同时修改`total`的值而导致的错误。
最后,我们定义一个主程序`Main`,在其中创建两个线程分别模拟学生从前门和后门进入教室的过程,并统计前后门进入的学生人数。具体实现如下:
```java
public class Main {
public static void main(String[] args) {
int n = 55; // 学生总数
int count0 = 0; // 从前门进入教室的学生人数
int count1 = 0; // 从后门进入教室的学生人数
Thread[] threads = new Thread[n];
for (int i = 0; i < n; i++) {
// 创建学生线程
threads[i] = new Thread(new Student());
// 随机选择前门或后门进入教室
int entranceId = (int) (Math.random() * 2);
if (entranceId == 0) {
count0++;
} else {
count1++;
}
// 启动学生线程
threads[i].start();
}
// 等待所有学生线程结束
for (int i = 0; i < n; i++) {
try {
threads[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 输出结果
System.out.println("Entrance 0: " + count0 + " students entered the classroom.");
System.out.println("Entrance 1: " + count1 + " students entered the classroom.");
System.out.println("Total: " + Student.getTotal() + " students entered the classroom.");
}
}
```
在主程序中,我们首先创建了`n`个学生线程,并在每个线程中随机选择前门或后门进入教室。然后,启动所有学生线程,等待它们全部结束后,输出前后门进入的学生人数和总人数。
以上就是利用接口`Runnable`编写线程程序,模拟学生从教室的前后门进入教室,并统计前后门进入的学生人数的Java代码。
阅读全文