通过实现Runnable接口创建多线程,模拟多线程模拟售票厅的列车售票。有四个窗口可发售某日某次列车的100张车票,用多线程模拟这4个窗口同时发售车票的情形。每发售一张票就在控制台打印输出车票序号。 (编写两个版本,一个未使用同步机制,一个使用了同步机制)用Java多线程方式编写
时间: 2024-03-11 19:51:02 浏览: 70
好的,以下是未使用同步机制的实现代码:
```
class TicketSeller implements Runnable {
private int tickets = 100;
public void run() {
while (tickets > 0) {
try {
Thread.sleep(100); // 模拟售票时间
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "售出了第" + tickets-- + "张票");
}
}
}
public class Test {
public static void main(String[] args) {
TicketSeller seller = new TicketSeller();
Thread thread1 = new Thread(seller, "窗口1");
Thread thread2 = new Thread(seller, "窗口2");
Thread thread3 = new Thread(seller, "窗口3");
Thread thread4 = new Thread(seller, "窗口4");
thread1.start();
thread2.start();
thread3.start();
thread4.start();
}
}
```
在这个例子中,我们实现了一个名为`TicketSeller`的类,该类实现了`Runnable`接口,并重写了`run()`方法来模拟售票过程。在`main()`方法中,我们创建了四个线程,分别代表四个售票窗口,它们共享一个`TicketSeller`对象。当一个窗口运行起来时,它会不断地售出车票,直到所有的车票都售完为止。
但是,由于没有使用同步机制,多个线程可能会同时访问`TicketSeller`对象的`tickets`变量,从而导致数据不一致。例如,当窗口1和窗口2同时执行时,它们可能会读取到相同的`tickets`值,从而导致售出相同的车票。因此,我们需要使用同步机制来避免这种情况。
以下是使用同步机制的实现代码:
```
class TicketSeller implements Runnable {
private int tickets = 100;
public synchronized void sellTicket() {
if (tickets > 0) {
try {
Thread.sleep(100); // 模拟售票时间
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "售出了第" + tickets-- + "张票");
}
}
public void run() {
while (true) {
sellTicket();
}
}
}
public class Test {
public static void main(String[] args) {
TicketSeller seller = new TicketSeller();
Thread thread1 = new Thread(seller, "窗口1");
Thread thread2 = new Thread(seller, "窗口2");
Thread thread3 = new Thread(seller, "窗口3");
Thread thread4 = new Thread(seller, "窗口4");
thread1.start();
thread2.start();
thread3.start();
thread4.start();
}
}
```
在这个例子中,我们在`TicketSeller`类中添加了一个`synchronized`修饰的`sellTicket()`方法,该方法用于售票。在这个方法中,我们使用`synchronized`来保证在同一时刻只有一个线程能够执行该方法。这样就避免了多个线程同时访问`tickets`变量的问题。
通过以上实现,我们就可以模拟多个窗口同时售票的情况,并保证数据的一致性。
阅读全文