javase实现银行转账

版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/qq137722697。 https://blog.csdn.net/qq137722697/article/details/49561367


10个账户,每个1000元,互相转账【随机转】,转了1000次之后就输出一下用户的余额和总的账户余额【要为10000】

1、主类

/**
 * 主类
 * 
 * @function 10个账户,每个1000元,互相转账【随机转】,转了1000次之后就输出一下用户的余额和总的账户余额【要为10000】
 * @author HDL
 * 
 */
public class BankMain {
	/**
	 * 主方法
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		Bank bank = new Bank();// 银行类
		BankThread[] bt = new BankThread[10];// 10个银行线程
		for (int i = 0; i < bt.length; i++) {// 开启10个线程
			bt[i] = new BankThread(bank, i);
			new Thread(bt[i]).start();
		}
	}
}

2、银行类

public class Bank {
	double[] account = new double[10];// 10个银行账户
	public Bank() {// 初始化银行账户类
		for (int i = 0; i < account.length; i++) {
			account[i] = 1000;
		}
	}
	/**
	 * 转账方法
	 * 
	 * @param from
	 *            谁转
	 * @param to
	 *            转给谁
	 * @param money
	 *            转多少
	 */
	public synchronized void transfer(int from, int to, double money) {
		// 转出前需要判断战账户余额是否有money那么多,没有就继续等待【这里需要使用while而不是if】
		while (account[from] <= money) {// 没有钱了就不能转了,等待看是否有人转过来
			try {
				wait();// 等待
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		// System.out.println("账户 " + from + " 向 " + to + " 转了  " + money);
		account[from] -= money;// 出账
		account[to] += money;// 入账
		notify();// 唤醒一个等待的线程
	}
	/**
	 * 显示用户余额和总额
	 */
	public synchronized void show() {
		int sum = 0;
		for (int i = 0; i < account.length; i++) {
			System.out.println("--------------------账户 " + (i + 1) + " 的余额为:"
					+ account[i]);
			sum += account[i];
		}
		System.out.println("--------------------银行总额为:" + sum);
	}
}

3、线程类

public class BankThread implements Runnable {
	Bank bank;// 银行实体
	private int count = 0;// 记录转账次数
	private int from = 0;// 固定由谁来转账
	/**
	 * 构造方法 初始化对象
	 * 
	 * @param bank
	 *            银行
	 * @param from
	 *            谁来转
	 */
	public BankThread(Bank bank, int from) {
		this.bank = bank;
		this.from = from;
	}
	@Override
	public void run() {
		while (true) {// 一直执行
			int to = (int) (Math.random() * 10);// 随机产生0-9的账户
			while (from == to) {// 这个账户不能为当前from,相同了就继续生成
				to = (int) (Math.random() * 10);// 重新生成
			}
			double money = (int) (Math.random() * 500 + 100);// 随机的转100-599的账
			bank.transfer(from, to, money);// 开始转账了
			count++;// 自增一
			// System.out.println("转了 " + count + " 次");
			if (count == 1000) {// 判断是否有1000次转账了
				count = 0;// 重新统计
				bank.show();// 显示余额
			}
		}
	}
}


4、运行结果


展开阅读全文

没有更多推荐了,返回首页