public class Program
{
public static void main(String[] args)
{
int sum=0;
Customer cust1=new Customer();
Customer cust2=new Customer();
cust1.start();
cust2.start();

class Customer extends Thread
{
Customer() { }
public void run()
{
for (int i = 0; i < 2; i++)
{
Store(1000);
}
}

} public synchronized void Store(int number)
{
System.out.println(getName() + " 存款:" + number + "\n");
sum += number;
System.out.println("汇款总额是:" + sum + "\n");
}
}
}

解决方案 »

  1.   

    假设有家银行(Bank),它可接受顾客的汇款,每做一次汇款,便可计算出汇款的总额(sum)。现在有两个顾客(customer1,customer2),每人都分2次,每次1000元将钱存入,编程实现最后银行汇款的总额。要求用同步线程实现
      

  2.   


    public class Program { int sum=0; public static void main(String[] args) {
       
             new Program().launch();
           }
    public void launch() { Customer cust1=new Customer();   
    Customer cust2=new Customer();
    cust1.start();
    cust2.start();
    }
        
            class Customer extends Thread {
           
                public void run() {                for (int i = 0; i < 2; i++) {    
                        Store(1000);
                    }
                }
            }        public synchronized void Store(int number){            System.out.println(" 存款:" + number + "\n");
                sum += number;
                System.out.println("汇款总额是:" + sum + "\n");
            }
    }这代码如有不懂的,可问我.
      

  3.   

    不好意思,上楼的没有排好, 现在重新排:public class Program{ int sum=0;   // 这个变量要作成员变量. public static void main(String[] args) {
       
             new Program().launch();
           } public void launch() {
    Customer cust1=new Customer();
    Customer cust2=new Customer();
    cust1.start();
    cust2.start();
    }
        
            class Customer extends Thread {
           
                public void run() {                for (int i = 0; i < 2; i++) {
                        Store(1000);
                    }
                }
            }        public synchronized void Store(int number){            System.out.println(" 存款:" + number + "\n");
                sum += number;
                System.out.println("汇款总额是:" + sum + "\n");
            }
    }
      

  4.   

    另外,楼主的getName()方法不存在,无法调用,所以删了.
      

  5.   

    楼上的程序没有同步。sum的值可能不正确。
    必须将int sum=0;改为volatile int sum=0;volatile修饰符可以保证任一线程在读取一个域时会看到最近刚
    被写入的值。
    也可以将sum += number;改为
    synchronized(sum){
     sum += number;
    }
      

  6.   


    public class Bank
    {
     int sum=0;
        public static void main(String[] args)
        {
         Bank bank1=new Bank();
            Customer cust1=new Customer(bank1,"c1");
            Customer cust2=new Customer(bank1,"c2");
            cust1.start();
            cust2.start();
        }
        public synchronized void Store(int number)
        {
            System.out.println( " 存款:" + number + "\n");
            sum += number;
            System.out.println("汇款总额是:" + sum + "\n");
        }
    }
    /**
     * 顾客类
     * @author new
     *
     */
    class Customer extends Thread
    {
    Bank bank;
    String  customerName;
        Customer(Bank bank,String customerName) {
         this.bank=bank;
         this.customerName=customerName;
        }
        public void run()
        {
            for (int i = 0; i < 2; i++)
            {
             bank.Store(1000);
            }
        }
        public String getCustomerName(){
         return customerName;
        }}
      

  7.   


            public synchronized void Store(int number){//这个不是同步的关键字吗?sum就不会出现问题了            System.out.println(" 存款:" + number + "\n");
                sum += number;
                System.out.println("汇款总额是:" + sum + "\n");
            }
      

  8.   

    惭愧啊……学艺不精。。还请各位多多指教啊...如果我想在输出时 显示具体哪个线程?
    System.out.println("顾客??"+" 存款:" + number + "\n");//这该怎么整啊??
      

  9.   


    System.out.println(Thread.currentThread());
    System.out.println(" 存款:" + number + "\n");
    这样好像 能区分,但还不完美……
      

  10.   


     System.out.println("线程名字:"+Thread.currentThread().getName()+" 存款:" + number + "\n");
      

  11.   


    public class Bank
    {
     int sum=0;
        public static void main(String[] args)
        {
         Bank bank1=new Bank();
            Customer cust1=new Customer(bank1,"c1","线程名字一");
            Customer cust2=new Customer(bank1,"c2","线程名字二");
            cust1.start();
            cust2.start();
        }
        public synchronized void Store(int number)
        {
        
            System.out.println(Thread.currentThread().getName()+" 存款:" + number + "\n");
            sum += number;
            System.out.println("汇款总额是:" + sum + "\n");
        }
    }
    /**
     * 顾客类
     * @author new
     *
     */class Customer extends Thread
    {
    Bank bank;
    String  customerName;
        Customer(Bank bank,String customerName,String threadName) {
         super(threadName);//设置线程的名字
         this.bank=bank;
         this.customerName=customerName;
        }
        public void run()
        {
            for (int i = 0; i < 30; i++)
            {
             bank.Store(1000);
            }
        }
        public String getCustomerName(){
         return customerName;
        }

      

  12.   


    Thread-1
     存款:1000汇款总额是:1000Thread-2
     存款:1000汇款总额是:2000Thread-1
     存款:1000汇款总额是:3000Thread-2
     存款:1000汇款总额是:4000
    呵呵,谢谢了。虽然不是 线程名。但总可以区分两个线程了。。
    感谢各位……
      

  13.   

    super(threadName);//设置线程的名字,看看我的上个回复
      

  14.   

    super(threadName);//设置线程的名字明白……thanks