采用Thread类编写多线程功能的程序模拟3个人卖票。张三、李四和赵五买电影票,售票元只有3张5元的人民币,电影票5元一张。张三拿一张20元的人民币排在李四的前面买票,李四拿一张10元的人民币排在赵五前面买票,赵五拿一张5元的人民币买票。
时间: 2024-02-26 07:53:00 浏览: 64
好的,以下是用Java编写的程序,采用Thread类实现多线程功能,模拟三个人买票的场景:
```java
public class TicketSeller {
static int money = 0;
static int tickets = 3;
public static void main(String[] args) {
new Thread(new ZhangSan()).start();
new Thread(new LiSi()).start();
new Thread(new ZhaoWu()).start();
}
static class ZhangSan implements Runnable {
@Override
public void run() {
synchronized (TicketSeller.class) {
while (true) {
if (money >= 5 && tickets > 0) {
money += 5;
tickets--;
System.out.println("张三买到了一张电影票,剩余票数为" + tickets + "张,售票员手中有" + money + "元");
} else if (money < 5) {
money += 20;
System.out.println("张三排在了李四前面,买票的钱不够,给售票员一张20元的人民币");
} else if (tickets <= 0) {
System.out.println("张三发现电影票已经售完,离开了售票处");
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
static class LiSi implements Runnable {
@Override
public void run() {
synchronized (TicketSeller.class) {
while (true) {
if (money >= 5 && tickets > 0) {
money += 5;
tickets--;
System.out.println("李四买到了一张电影票,剩余票数为" + tickets + "张,售票员手中有" + money + "元");
} else if (money < 5) {
money += 10;
System.out.println("李四排在了赵五前面,买票的钱不够,给售票员一张10元的人民币");
} else if (tickets <= 0) {
System.out.println("李四发现电影票已经售完,离开了售票处");
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
static class ZhaoWu implements Runnable {
@Override
public void run() {
synchronized (TicketSeller.class) {
while (true) {
if (money >= 5 && tickets > 0) {
money += 5;
tickets--;
System.out.println("赵五买到了一张电影票,剩余票数为" + tickets + "张,售票员手中有" + money + "元");
} else if (tickets <= 0) {
System.out.println("赵五发现电影票已经售完,离开了售票处");
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
```
在程序中,我们定义了一个售票员类TicketSeller,其中有一个共享变量money表示售票员手中拥有的人民币金额,另一个共享变量tickets表示售票员手中拥有的电影票张数。然后我们创建三个线程分别模拟张三、李四和赵五的购票过程。
在每个线程的run()方法中,我们使用synchronized关键字锁住了TicketSeller.class,确保了多个线程同时访问售票员时的线程安全。在循环中,我们分别处理了三个人的购票流程。如果手中的钱足够买票,就减去5元的票价和加上5元的人民币;如果钱不够,就给售票员一张大面额的钞票,等着找零;如果票已经售完,就离开售票处。
以上程序可以模拟三个人买票的场景,确保了线程安全,并且可以正确处理找零的情况。
阅读全文