用java编译模拟一个打电话的程序,一个电话的接听者类通过线程实现接听三个不同电话,每个 电话接通时间,取 10 秒-30 秒之间的随机数。
时间: 2024-11-06 12:19:03 浏览: 39
在Java中,我们可以使用`Thread`类以及`Random`类来模拟这样的场景。首先,我们需要定义一个`Receiver`类作为电话接听者,它可以同时处理多个电话线程,每个电话线程代表一个不同的来电者。这里是一个简单的示例:
```java
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit;
public class Receiver extends Thread {
private List<PhoneCall> calls = new ArrayList<>();
private Random random = new Random();
public void addCall(int startTime) {
PhoneCall call = new PhoneCall(startTime);
calls.add(call);
if (calls.size() == 3) {
startNextCall();
}
}
private void startNextCall() {
if (!calls.isEmpty()) {
PhoneCall nextCall = calls.remove(0);
new Thread(() -> nextCall.execute()).start();
}
}
@Override
public void run() {
for (PhoneCall call : calls) {
call.run(this);
}
}
static class PhoneCall implements Runnable {
private final long startTime;
private Receiver receiver;
public PhoneCall(long startTime) {
this.startTime = startTime;
}
public void execute() {
try {
Thread.sleep(random.nextInt((int) TimeUnit.SECONDS.toMillis(30)) + 10 * 1000); // 随机等待时间,10秒到30秒
System.out.printf("电话 %d 已经接听,通话开始时间: %dms%n", receiver.calls.indexOf(this), startTime);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
receiver.calls.remove(this);
}
}
}
public static void main(String[] args) {
Receiver receiver = new Receiver();
receiver.start();
// 添加电话
receiver.addCall(System.currentTimeMillis());
receiver.addCall(System.currentTimeMillis() + 5000);
receiver.addCall(System.currentTimeMillis() + 12000);
}
}
```
在这个例子中,`Receiver`类继承自`Thread`,并在run方法中处理电话。`PhoneCall`类实现了`Runnable`接口,代表单个电话,它的execute方法中包含了随机等待时间和电话接听操作。
当你运行这个程序时,`main`函数会创建一个`Receiver`实例并添加三个电话,电话的接通时间由用户指定或随机生成。每次电话线程执行完毕,接收者会移除该电话并将下一条待处理的电话放入队列。
阅读全文