黑马程序员技术交流社区

标题: 没找出来错,Thread问题 [打印本页]

作者: 刘茂林    时间: 2013-5-9 10:17
标题: 没找出来错,Thread问题
本帖最后由 刘茂林 于 2013-5-9 17:49 编辑
  1. class Back// 创建银行类
  2. {
  3.     String name;
  4.     int NO;
  5. }

  6. class Input implements Runnable// 存钱
  7. {
  8.     private Back bk;// 声明银行类的引用

  9.     Input(Back bk)//构造函数  这里的bk是主函数上传递过来的对象引用
  10.     {
  11.         this.bk = bk;
  12.     }

  13.     public void run()
  14.     {
  15.         int x = 0;// 用于做判断 当为0的时候存入美元 当为1的时候存入人民币
  16.         int i = 100;
  17.         while (i > 0)
  18.         {
  19.             synchronized (bk)// 这里的bk是两个线程共同持有的
  20.             {
  21.                 if (x == 0)
  22.                 {
  23.                     bk.name = "美元";
  24.                     bk.NO = 1;
  25.                 } else
  26.                 {
  27.                     bk.name = "renminbi";
  28.                     bk.NO = 2;

  29.                 }
  30.                 i--;
  31.                 x = (x + 1) % 2;// 如果想让两个线程交替进行的话必须要进行判断 或者用单例设计模式也可以
  32.                 // 这里是用来做判断的
  33.             }

  34.         }
  35.     }

  36. }

  37. class Output implements Runnable// 取钱
  38. {
  39.     private Back bk;

  40.     Output(Back bk)
  41.     {
  42.         this.bk = bk;//同样的道理
  43.     }
  44.     public void run()
  45.     {
  46.         int i = 100;
  47.         while (i > 0)
  48.         {
  49.             synchronized (bk)
  50.             {
  51.                 System.out.println(bk.name + "......" + bk.NO);
  52.                 i--;
  53.             }
  54.         }

  55.     }
  56. }

  57. public class ThreadDemo3
  58. {
  59.     public static void mian(String[] args)
  60.     {
  61.         Back bk = new Back();

  62.         Input in = new Input(bk);
  63.         Output out = new Output(bk);
  64.         
  65.         Thread t1 = new Thread(in);//这里的是和synchronized配套使用的 使用过的格式
  66.         Thread t2 = new Thread(out);//将Runnable接口的子类对象作为Thread类的构造函数参数进行传递
  67.         t1.start();
  68.         t2.start();

  69.     }

  70. }
复制代码

作者: 殇_心。    时间: 2013-5-9 10:26
public static void mian(String[] args)   main函数写错了
作者: 飞鸟青崖    时间: 2013-5-9 11:32
主函数写错了。我估计你用的100太少了,运行的时候可能看不到交替出现的效果。
作者: 刘茂林    时间: 2013-5-9 11:36
殇_心。 发表于 2013-5-9 10:26
public static void mian(String[] args)   main函数写错了

已经改过 为什么只出现 人民币 2
作者: 1844611785    时间: 2013-5-9 12:40
class Back// 创建银行类
{
        String name;
        int NO;
}
class Input implements Runnable// 存钱
{
        private Back bk;// 声明银行类的引用
        Input(Back bk)//构造函数  这里的bk是主函数上传递过来的对象引用
    {
                this.bk = bk;
        }
        public void run()
        {
                int x = 0;// 用于做判断 当为0的时候存入美元 当为1的时候存入人民币
                int i = 100;
       
       
                while(i>0)
                {
                        synchronized (bk)// 这里的bk是两个线程共同持有的
                        {
              if (x == 0)
                                {
                    bk.name = "美元";
                    bk.NO = 1;
                                        System.out.println("存美元");
                }
                                else
                {
                                        bk.name = "renminbi";
                                        bk.NO = 2;
                                        System.out.println("存人民币");
                                }              
                                        i--;
                                        x = (x + 1) % 2;// 如果想让两个线程交替进行的话必须要进行判断 或者用单例设计模式也可以

                // 这里是用来做判断的
                        }
                }       


        }


}


class Output implements Runnable// 取钱
{
        private Back bk;
        Output(Back bk)
        {
                this.bk = bk;//同样的道理
        }
        public void run()
        {
                int i = 100;
               
                while (i > 0)
                {
                        synchronized (bk)
                        {
               System.out.println(bk.name + "......" + bk.NO);
                i--;
                        }

        }
               


    }

}



public class ThreadDemo3

{

    public static void main(String[] args)

    {

        Back bk = new Back();



        Input in = new Input(bk);

        Output out = new Output(bk);

        

        Thread t1 = new Thread(in);
               
                //这里的是和synchronized配套使用的 使用过的格式

        Thread t2 = new Thread(out);//将Runnable接口的子类对象作为Thread类的构造函数参数进行传递

        t1.start();
               

       t2.start();


  }
}

作者: 胡帅冰    时间: 2013-5-9 15:04
  1. class Back
  2. {
  3.     String name;
  4.     double num;
  5. }

  6. class Input implements Runnable
  7. {
  8.     private Back bk,bc;

  9.     Input(Back bk,Back bc)
  10.     {
  11.         this.bk = bk;
  12.                 this.bc=bc;
  13.     }

  14.     public void run()
  15.     {
  16.         int x = 0;
  17.         while (true)
  18.         {
  19.             synchronized (LuntanTest.class)
  20.             {
  21.                 if (x == 0)
  22.                 {
  23.                     bk.name = "美元";
  24.                     bk.num +=100 ;
  25.                                         System.out.println("存入:"+" 200 美元 。账户余额: "+bk.num+"  "+bk.name);
  26.                                         x=1;
  27.                 } else
  28.                 {
  29.                     bc.name = "RMB";
  30.                     bc.num+= 200;
  31.                                         System.out.println("存入:"+" 200RMB。 账户余额: "+bc.num+" "+bc.name);
  32.                                         x=0;

  33.                 }
  34.             }

  35.         }
  36.     }

  37. }

  38. class Output implements Runnable
  39. {
  40.     private Back bk,bc;
  41.     int a=1;
  42.         double mony;
  43.     Output(Back bk,Back bc)
  44.     {
  45.         this.bk = bk;
  46.                 this.bc = bc;
  47.     }
  48.     public void run()
  49.     {

  50.         while (true)
  51.         {
  52.                         mony=new RandomTest().getMony();
  53.                         synchronized(LuntanTest.class)
  54.                         {
  55.                                
  56.                                 if(bk.num>mony&a==1)
  57.                                 {
  58.                                         bk.num-=mony;
  59.                                         System.out.println("取款:"+mony+" "+bk.name+"  余额为:"+bk.num+" "+bk.name);
  60.                                        
  61.                                         a=0;
  62.                                 }
  63.                                 else if (bc.num>mony&a==0)
  64.                                 {
  65.                                         bc.num-=mony;
  66.                                         System.out.println("取款:"+mony+" "+bc.name+"  余额为:"+bc.num+" "+bc.name);
  67.                                        
  68.                                         a=1;
  69.                                 }
  70.                                 else
  71.                                 {
  72.                                         System.out.println("银行账户没钱了......");

  73.                                 }
  74.                         }
  75.         }

  76.     }
  77. }
  78. class RandomTest
  79. {
  80.         public double getMony()
  81.         {
  82.                 return (double)Math.random()*1000;
  83.         }
  84. }

  85. public class LuntanTest
  86. {
  87.     public static void main(String[] args)
  88.     {
  89.         Back bk = new Back();
  90.                 Back bc = new Back();

  91.         Input in = new Input(bk,bc);
  92.         Output out = new Output(bk,bc);
  93.         
  94.         Thread t1 = new Thread(in);
  95.         Thread t2 = new Thread(out);
  96.         t1.start();
  97.         t2.start();

  98.     }

  99. }
复制代码
楼主,代码这样写会有点意思。
你的源代码中  是main错写成mian了。
作者: 刘茂林    时间: 2013-5-9 17:29
胡帅冰 发表于 2013-5-9 15:04
楼主,代码这样写会有点意思。
你的源代码中  是main错写成mian了。

汗 在改过了
作者: 刘茂林    时间: 2013-5-9 17:29
本帖最后由 刘茂林 于 2013-5-9 17:48 编辑
胡帅冰 发表于 2013-5-9 15:04
楼主,代码这样写会有点意思。
你的源代码中  是main错写成mian了。

感谢。。。多谢帮助啊,代码写的太好了。。。哈哈
作者: 胡帅冰    时间: 2013-5-9 18:35
刘茂林 发表于 2013-5-9 17:29
汗 在改过了

:)  我也是看到线程了,看到你这个程序了,就改了一下。为了好玩嘛,同时多写写代码。嘿嘿……




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2