老师给了个题目
    模拟银行系统对存取款的处理。假设存款人A和取款人B在同一时间对同一帐号进行操作帐号本身有1000元,A进行了2次存款操作,第一次存入200元,第二次存入400元与此同时,B进行了2次取款操作,第一次取100元,第二次取50元。如果A和B单独操作,对A帐号:1000+200+400=1600元。对B帐号:100-100-50=850元银行系统必须保证在同一时间内只有一个人可以对帐号进行操作,需要同步。
   感觉很简单,但是做出来感觉很怪,怎样才算让A和B同时进行操作。还有Runnable接口和Thread类中的Run方法有什么意义?
  以下是本人写的代码,高手们帮我纠正纠正!!
  public class Program2 extends Thread/*这个是账户类*/
{

   int money=1000;
   Object ob=null;
  
   public Program2()
   {
     ob=new Object();
     
     System.out.println("此时账户还有:"+this.money+"元");
   }
   public  void getMoney(int mount)
   {
      synchronized(ob)
      {
      
        this.money=this.money-mount;
       
       }
   }
   public  void saveMoney(int mount)
   {
      synchronized(ob)
      {
      
      this.money=this.money+mount;
     
      }
   }
   public int yuer()
   {
      return this.money;
   }
   public static void main(String[] args)
   {
      Program2 count=new Program2();
      count.start();
      Person A=new Person(count,"A");
      Person B=new Person(count,"B");
      A.start();
      B.start();
      A.saveMoney(200);
      A.saveMoney(400);
      B.getMoney(100);
      B.getMoney(50);
      System.out.println(A.isAlive());
      System.out.println(B.isAlive());
      
   }
   
}
class Person extends Thread
{
Program2 count=null;
String name=null;
public Person(Program2 count,String name)
{
this.count=count;
this.name=name;
 
}
public void getMoney(int mount)
{
if(count.yuer()<mount)
{
System.out.println("对不起,余额不足");
System.out.println("此时账户还有:"+count.yuer()+"元");

return;
}
count.getMoney(mount);

System.out.println(this.name+"取出"+mount+"元");
        System.out.println("此时账户还有:"+count.yuer()+"元");
}
public void saveMoney(int mount)
{
count.saveMoney(mount);
System.out.println(this.name+"存入"+mount+"元");
        System.out.println("此时账户还有:"+count.yuer()+"元");
}

}
  

解决方案 »

  1.   


    public class Program2
    //extends Thread/*这个是账户类*/
    { int money = 1000; Object ob = null; public Program2() {
    ob = new Object(); System.out.println("此时账户还有:" + this.money + "元");
    } public void getMoney(int mount) {
    synchronized (ob) { this.money = this.money - mount; }
    } public void saveMoney(int mount) {
    synchronized (ob) { this.money = this.money + mount; }
    } public int yuer() {
    return this.money;
    } public static void main(String[] args) {
    Program2 count = new Program2();
    // count.start();
    Person A = new Person(count, "A");
    Person B = new Person(count, "B");
    A.start();
    B.start();
    /* A.saveMoney(200);
    A.saveMoney(400);
    B.getMoney(100);
    B.getMoney(50);*/
    System.out.println(A.isAlive());
    System.out.println(B.isAlive()); }}class Person extends Thread {
    Program2 count = null; String name = null; public Person(Program2 count, String name) {
    this.count = count;
    this.name = name; } public void getMoney(int mount) {
    if (count.yuer() < mount) {
    System.out.println("对不起,余额不足");
    System.out.println("此时账户还有:" + count.yuer() + "元"); return;
    }
    count.getMoney(mount); System.out.println(this.name + "取出" + mount + "元");
    System.out.println("此时账户还有:" + count.yuer() + "元");
    } public void saveMoney(int mount) {
    count.saveMoney(mount);
    System.out.println(this.name + "存入" + mount + "元");
    System.out.println("此时账户还有:" + count.yuer() + "元");
    }
    public void run(){
    if(this.name.equals("A")){
    saveMoney(200);
    try {
    Thread.currentThread().sleep(200);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    saveMoney(400);
    }else if(this.name.equals("B")){
    getMoney(100);
    try {
    Thread.currentThread().sleep(200);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    getMoney(50);
    }
    }
    }账户类是一个被多个线程共享的类,没必要是Thread类
    Person类需重写run方法,具体看代码!