1.写一个java程序,模拟多人从同一个账户上取钱的过程 假设账户上有10000元钱,3人从上面随机取(范围为100至300)元钱,如果取完了,就提示已经没钱了。 2.票务中心总共有10000张票,售票点有很多,售票点,车站,
时间: 2023-08-22 15:03:32 浏览: 36
景区等地方都可以售票。设计一个Java程序,实现多线程售票系统,要求能够模拟多个售票点同时售票,保证票数正确,且不会出现重复售票的情况。
1. 实现多人从同一个账户上取钱的过程的Java程序:
```java
import java.util.Random;
public class Account {
private int balance; // 账户余额
public Account(int balance) {
this.balance = balance;
}
// 取钱方法
public synchronized void withdraw(int amount) {
if (balance >= amount) {
System.out.println(Thread.currentThread().getName() + " 取钱成功,取出 " + amount + " 元");
balance -= amount;
System.out.println("账户余额为:" + balance + " 元");
} else {
System.out.println(Thread.currentThread().getName() + " 取钱失败,余额不足!");
}
}
public static void main(String[] args) {
Account account = new Account(10000);
for (int i = 0; i < 3; i++) {
new Thread(() -> {
Random random = new Random();
int amount = random.nextInt(201) + 100; // 随机取款金额在100~300之间
account.withdraw(amount);
}).start();
}
}
}
```
2. 实现多线程售票系统的Java程序:
```java
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class TicketCenter {
private static int total = 10000; // 总票数
private static Lock lock = new ReentrantLock(); // 锁对象
public static void main(String[] args) {
for (int i = 0; i < 10; i++) { // 10个售票点
new Thread(() -> {
while (true) {
lock.lock(); // 加锁
if (total > 0) {
System.out.println(Thread.currentThread().getName() + " 售出第 " + total + " 张票");
total--;
} else {
System.out.println("票已售完!");
break;
}
lock.unlock(); // 解锁
}
}).start();
}
}
}
```
以上就是两道题的Java代码实现。注意在第二道题中,需要使用锁机制来保证线程安全,避免出现重复售票或超售的情况。