class Bank implements Runnable
{
    int money = 100;     // 声明一个int型变量money,初值为100
    Thread zhang,keven;
    
    Bank()
    {
       zhang = new Thread(this);   // 创建zhang,Bank对象为zhang的目标对象
       zhang.setName("会计");// 设置zhang线程的名字为“会计”
       keven = new Thread(this);// 创建keven,Bank对象为keven的目标对象 
       keven.setName("出纳");// 设置keven线程的名字为“出纳”
    } 
    public void run()      
    {   
     int i = 0;// 声明一个int类型变量i,初值为0
        while(true)
         {
        
           if(zhang.getState().equals(Thread.State.RUNNABLE))  // 判断线程zhang是否正在占有CUP资源
            {  
               i=i+1;
               money=money+1;
               System.out.printf("\n%s将money的值改为%d\t",zhang.getName(),money);
               System.out.printf("%s的局部变量i=%d\n",zhang.getName(),i);
               if(i>=6)
                  { 
                     System.out.printf("%s线程进入死亡状态\n",zhang.getName());
                      zhang.stop(); // 使得线程zhang进入死亡状态
                  }
               try{
                     Thread.sleep(2000);
                  }
               catch(InterruptedException e)
                  {
                 System.out.println("e");
                  }
            } 
           else if(keven.getState().equals(Thread.State.RUNNABLE))  // 判断线程keven是否正在占有CUP资源
            {
               i=i-1;
               money=money-1;
               System.out.printf("\n%s将money的值改为%d\t",keven.getName(),money);
               System.out.printf("%s的局部变量i=%d\n",keven.getName(),i);
               if(i<=-6)
                  { 
                     System.out.printf("%s线程进入死亡状态\n",keven.getName());
                     keven.stop();  // 使得线程keven进入死亡状态
                  }
               try{
                     Thread.sleep(1000);
                  }
               catch(InterruptedException e)
                  {
                System.out.println("e");
                  }
             } 
         }
    }
}
class BankExample
{
    public static void main(String args[ ])
    {
        Bank bank=new Bank();
        bank.zhang.start();
        bank.keven.start(); 
    }
}
输出结果是:会计将money的值改为101
会计将money的值改为102 会计的局部变量i=1
会计的局部变量i=1出纳将money的值改为101 出纳的局部变量i=0会计将money的值改为102 会计的局部变量i=2出纳将money的值改为101 出纳的局部变量i=-1出纳将money的值改为100
会计将money的值改为101 会计的局部变量i=3
出纳的局部变量i=-2出纳将money的值改为100 出纳的局部变量i=-3会计将money的值改为101 会计的局部变量i=4出纳将money的值改为100 出纳的局部变量i=-4出纳将money的值改为99 出纳的局部变量i=-5会计将money的值改为100 会计的局部变量i=5出纳将money的值改为99 出纳的局部变量i=-6
出纳线程进入死亡状态会计将money的值改为100 会计的局部变量i=6
会计线程进入死亡状态我想问下:
会计将money的值改为101
会计将money的值改为102 会计的局部变量i=1
会计的局部变量i=1是怎么出现的PS:是老师给的实验,我写完了总觉得有哪里不对,带注释的前面就是要求填的,我不明白老师到底是想要会计和出纳都只能修改6次还是说反复进出知道有个到了6或者-6为止

解决方案 »

  1.   


               if(zhang.getState().equals(Thread.State.RUNNABLE))  // 判断线程zhang是否正在占有CUP资源
                {  
                   i=i+1;
                 money=money+1;
                   System.out.printf("\n%s将money的值改为%d\t",zhang.getName(),money);
                   System.out.printf("%s的局部变量i=%d\n",zhang.getName(),i);
                   if(i>=6)
                      { 
                         System.out.printf("%s线程进入死亡状态\n",zhang.getName());
                          zhang.stop(); // 使得线程zhang进入死亡状态
                      }
                   try{
                         Thread.sleep(2000);
                      }
                   catch(InterruptedException e)
                      {
                           System.out.println("e");
                      }
                } 
               else if(keven.getState().equals(Thread.State.RUNNABLE))  // 判断线程keven是否正在占有CUP资源
                {
                   i=i-1;
                   money=money-1;
                   System.out.printf("\n%s将money的值改为%d\t",keven.getName(),money);
                   System.out.printf("%s的局部变量i=%d\n",keven.getName(),i);
                   if(i<=-6)
                      { 
                         System.out.printf("%s线程进入死亡状态\n",keven.getName());
                         keven.stop();  // 使得线程keven进入死亡状态
                      }
                   try{
                         Thread.sleep(1000);
                      }
                   catch(InterruptedException e)
                      {
                       System.out.println("e");
                      }
                 } 
             }
      

  2.   

               i=i+1;
                   money=money+1;           i=i-1;
                   money=money-1;
      

  3.   

    是因为:
    bank.zhang.start();的时候递增了一次,
    然后bank.keven.start();又递增了一次?
      

  4.   

    搞懂了,看来开始是被2个i迷惑了
    我把zhang.getName(),keven.getName()全替换成Thread.currentThread().getName()
    就明白了但本身这个实验这种写法是不是有哪不清楚,要实现zhang线程只能money+1,keven线程只能money-1;在这个基础上靠加synchronized可以完成么,试了几次都不太对