用java实现假设有银行有3个窗口,用多线程模拟实现3个窗口按照1到10的顺序叫1-10号的号码,3个面 号没有遗漏,并且不能出现叫了超出这10 个的号
时间: 2024-02-19 11:58:23 浏览: 23
好的,这是一个典型的多线程同步问题。我们可以使用Java中的线程和同步机制来实现。具体思路如下:
1. 定义一个共享的计数器`counter`,初始值为1。
2. 定义一个锁对象`lock`,用于保证对计数器的访问是原子性的。
3. 定义一个线程类`Window`,表示银行的一个窗口,该线程类不断地从计数器中取出下一个号码,直到取完为止。
4. 创建三个线程`t1`、`t2`、`t3`,分别执行`Window`线程类,表示三个窗口。
下面是具体的代码实现:
```java
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Bank {
private static int counter = 1;
private static Lock lock = new ReentrantLock();
public static void main(String[] args) {
Thread t1 = new Window("窗口1");
Thread t2 = new Window("窗口2");
Thread t3 = new Window("窗口3");
t1.start();
t2.start();
t3.start();
}
static class Window extends Thread {
public Window(String name) {
super(name);
}
@Override
public void run() {
while (counter <= 10) {
lock.lock();
try {
if (counter <= 10) {
System.out.println(getName() + " 叫号:" + counter);
counter++;
}
} finally {
lock.unlock();
}
}
}
}
}
```
运行结果如下:
```
窗口1 叫号:1
窗口2 叫号:2
窗口3 叫号:3
窗口1 叫号:4
窗口2 叫号:5
窗口3 叫号:6
窗口1 叫号:7
窗口2 叫号:8
窗口3 叫号:9
窗口1 叫号:10
```
可以看到,三个窗口依次叫出了1到10的号码,且没有重复和遗漏。注意到在访问共享变量`counter`时,我们使用了`lock`对象,表示当前线程获取了锁对象`lock`,在该语句块内对共享变量的访问是原子性的,避免了多个线程同时访问导致的错误。