用Java设计一个财务收支业务的程序,构建存钱、取钱两个线程。 存钱线程启动后,每隔1秒钟,随机往账户中存入[0,20]块钱。 每次存钱程序输出:in+空格+存入金额+空格+账户余额 当金额超过100时,唤醒取钱线程, 取钱线程被唤醒后,随机在账户中提取[50-100]块钱。 每次取钱程序输出:out+空格+支取金额+空格+账户余额
时间: 2023-12-31 17:03:46 浏览: 156
好的,这是一个有趣的问题,我会尽力回答。以下是我用Java设计的程序:
```
import java.util.Random;
public class FinanceProgram {
private static int balance = 0; // 账户余额
private static final int MAX_BALANCE = 100; // 最大账户余额
private static final int MIN_DRAW = 50; // 最小提取金额
private static final int MAX_DRAW = 100; // 最大提取金额
private static final int MAX_DEPOSIT = 20; // 最大存入金额
public static void main(String[] args) {
Thread depositThread = new Thread(new DepositThread());
Thread drawThread = new Thread(new DrawThread());
depositThread.start();
drawThread.start();
}
// 存钱线程
static class DepositThread implements Runnable {
@Override
public void run() {
Random random = new Random();
while (true) {
int deposit = random.nextInt(MAX_DEPOSIT + 1);
balance += deposit;
System.out.println("in " + deposit + " " + balance);
if (balance >= MAX_BALANCE) {
synchronized (this) {
notify(); // 唤醒取钱线程
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// 取钱线程
static class DrawThread implements Runnable {
@Override
public void run() {
Random random = new Random();
while (true) {
if (balance < MAX_BALANCE) {
synchronized (this) {
try {
wait(); // 等待存钱线程唤醒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
int draw = random.nextInt(MAX_DRAW - MIN_DRAW + 1) + MIN_DRAW;
balance -= draw;
System.out.println("out " + draw + " " + balance);
}
}
}
}
```
以上程序中,我们定义了两个静态内部类 DepositThread 和 DrawThread,分别用于存钱和取钱。在主程序中,我们创建了两个线程分别运行这两个内部类。
DepositThread 每隔一秒钟随机生成一个 [0,20] 范围内的数字,将其加入到账户余额中,并输出当前存入金额和账户余额。如果账户余额超过设定的最大值 MAX_BALANCE,就唤醒 DrawThread 线程。在每次存钱后,线程休眠 1 秒钟。
DrawThread 在一开始的时候会一直等待 DepositThread 的唤醒。一旦 DepositThread 唤醒,就会随机生成一个 [50,100] 范围内的数字,将其从账户余额中减去,并输出当前提取金额和账户余额。如果账户余额未超过最大值 MAX_BALANCE,则继续等待 DepositThread 的唤醒。
以上就是我用 Java 设计的财务收支业务的程序,希望能够帮到你。如果有任何问题或疑问,欢迎随时提出。
阅读全文