这是一个多线程的银行存钱系统模拟
需求是
1.有三个人希望在银行存钱,互不影响,所以每个人占一个线程
2.每次存100元,每人存10次
思路:
1.定义一个银行系统,拥有存钱方法,展示存储状况的方法
2.定义一个存钱的线程类,拥有对银行的操作方法
3.在主线程中实现多个线程同时存钱
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class BankDeml {
private static DongYingBank bank=new DongYingBank();
public static void main(String[] args)
{
DuoTreadStore zhang=new DuoTreadStore(bank,"zhangsan");
DuoTreadStore li=new DuoTreadStore(bank,"lisi");
DuoTreadStore wang=new DuoTreadStore(bank,"wangwu");
Thread zhangStore=new Thread(zhang);
Thread wangStore=new Thread(wang);
Thread liStore=new Thread(li);
zhangStore.start();
liStore.start();
wangStore.start();
try {
Thread.sleep(0b110010000);
} catch (InterruptedException e) {
e.printStackTrace();
}//担心主线程进行太快,其他线程还没存上,所以睡一会
System.out.println(bank.toString());
}
}
//首先要定义一个银行的存储信息的类
class DongYingBank
{
private HashMap<String,Double> money;
DongYingBank()
{
money=new HashMap<String,Double>();
}
@Override
public String toString()
{
StringBuilder str=new StringBuilder();
Set<Map.Entry<String,Double>> info=money.entrySet();
Iterator<Map.Entry<String,Double>> it=info.iterator();
while(it.hasNext())
{
Map.Entry<String,Double> user=it.next();
str.append(user.getKey()+"存储了"+user.getValue()+"元");
}
return str.toString();
}
/**
* 这个函数用于建立用户和存储金钱,已存在用户会自动添加到账户名下,未存在账户会新建
* @param name 已存在或将要新建的账户
* @param mon 要添加的金额
* */
public synchronized String add(String name,Double mon)
{
try{
if (money.containsKey(name))
{
Double qian=money.get(name)+mon;
money.put(name,qian);
}
else{
money.put(name,mon);
}
}
catch(Exception e)
{
return "添加失败,请重新操作";
}
return "添加成功";
}
}
class DuoTreadStore implements Runnable
{
DongYingBank bank;
String name;
DuoTreadStore(DongYingBank bank,String name)
{
this.bank=bank;
this.name=name;
}
@Override
public void run()
{
int i=0;
for(i=0;i<10;i++)
{
bank.add(name,100.0);
}
System.out.println(name+"把钱存好了");
}
}
这个程序的特点是,应用到了map集合,多线程,StringBulider.
下面是运行结果:
wangwu把钱存好了
lisi把钱存好了
zhangsan把钱存好了
lisi存储了1000.0元zhangsan存储了1000.0元wangwu存储了1000.0元