A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. class Ticket implements Runnable
  2. {
  3.      private int tick = 20;
  4.      Object obj = new Object();
  5.      boolean flag = true;
  6.      public synchronized void run()
  7.      {
  8.           if(flag)
  9.          {
  10.                while(true)
  11.               {
  12.                     synchronized(this)
  13.                     {
  14.                           if(tick>0)
  15.                          {
  16.                                 try{Thread.sleep(10);}catch(Exception e){}
  17.                                 System.out.println(Thread.currentThread().getName()+"....sale : "+ tick--);
  18.                          }
  19.                     }
  20.               }
  21.        }
  22.        else
  23.             while (true)
  24.              {
  25.                    show();
  26.              }
  27.     }
  28.     public synchronized void show()
  29.     {
  30.             if(tick>0)
  31.            {
  32.                  try{Thread.sleep(10);}catch(Exception e){}
  33.                  System.out.println(Thread.currentThread().getName()+"----show : "+ tick--);
  34.            }
  35.     }
  36. }

  37. class ThisLockDemo
  38. {
  39.        public static void main(String[] args)
  40.        {
  41.               Ticket t = new Ticket();

  42.               Thread t1 = new Thread(t);
  43.               Thread t2 = new Thread(t);

  44.               t1.start();
  45.               try{Thread.sleep(10);}catch(Exception e){}
  46.               t.flag = false;
  47.               t2.start();
  48.       }
  49. }
  50. /*
  51. 为什么我的输出结果总是这个:
  52. Thread-0....sale : 20
  53. Thread-0....sale : 19
  54. Thread-0....sale : 18
  55. Thread-0....sale : 17
  56. Thread-0....sale : 16
  57. Thread-0....sale : 15
  58. Thread-0....sale : 14
  59. Thread-0....sale : 13
  60. Thread-0....sale : 12
  61. Thread-0....sale : 11
  62. Thread-0....sale : 10
  63. Thread-0....sale : 9
  64. Thread-0....sale : 8
  65. Thread-0....sale : 7
  66. Thread-0....sale : 6
  67. Thread-0....sale : 5
  68. Thread-0....sale : 4
  69. Thread-0....sale : 3
  70. Thread-0....sale : 2
  71. Thread-0....sale : 1
  72. 把ticket改成很大的数也是一样。
  73. 只能输出*sale : *的结果,而不能输出show的,
  74. 同样的代码毕老师的两种都能输出。

  75. 是电脑问题还是我这代码中有点不合理之处,求大伙帮忙解决,真的很急!!!!!!
  76. */
复制代码

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

11 个回复

倒序浏览
start()方法启动线程 运行的是run()方法呀  show()方法都没有被调用

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报 1 0
strat调用的是run方法。
回复 使用道具 举报
public synchronized void run()这个里面的 synchronized去掉就好了
你run方法里面已经有一个同步代码块了

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
陈鹏 发表于 2013-6-19 21:44
public synchronized void run()这个里面的 synchronized去掉就好了
你run方法里面已经有一个同步代码块了 ...

发现还是不行,运行结果还是一样。。。纠结
回复 使用道具 举报
ㄗs:/|丶hearts 发表于 2013-6-19 18:59
start()方法启动线程 运行的是run()方法呀  show()方法都没有被调用

我也知道show()方法没有被调用 ,想求解为什么?毕老师的代码也是这样,但我的结果明显跟毕老师的不一样(毕老师的结果有show)。
回复 使用道具 举报

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
本帖最后由 ㄗs:/|丶hearts 于 2013-6-19 23:04 编辑
刘利民 发表于 2013-6-19 22:43
我也知道show()方法没有被调用 ,想求解为什么?毕老师的代码也是这样,但我的结果明显跟毕老师的不一样 ...


代码没错  我用tick = 20运行出来 有show的

1.png (10.01 KB, 下载次数: 0)

1.png
回复 使用道具 举报
刘利民 发表于 2013-6-19 22:43
我也知道show()方法没有被调用 ,想求解为什么?毕老师的代码也是这样,但我的结果明显跟毕老师的不一样 ...

synchronized(Ticket.class)  你改成这样试试
回复 使用道具 举报
本帖最后由 陈鹏 于 2013-6-19 23:40 编辑
刘利民 发表于 2013-6-19 22:41
发现还是不行,运行结果还是一样。。。纠结
  1. <div class="blockcode"><blockquote>class Ticket implements Runnable
  2. {
  3.      private int tick = 300;
  4.      Object obj = new Object();
  5.      boolean flag = true;
  6.      public void run()//就是这的问题把synchronized去掉就OK了
  7.      {
  8.           if(flag)
  9.          {
  10.                while(true)
  11.               {
  12.                     synchronized(this)
  13.                     {
  14.                           if(tick>0)
  15.                          {
  16.                                 try{Thread.sleep(10);}catch(Exception e){}
  17.                                 System.out.println(Thread.currentThread().getName()+"....sale : "+ tick--);
  18.                          }
  19.                     }
  20.               }
  21.        }
  22.        else
  23.             while (true)
  24.              {
  25.                    show();
  26.              }
  27.     }
  28.     public synchronized void show()
  29.     {
  30.             if(tick>0)
  31.            {
  32.                  try{Thread.sleep(10);}catch(Exception e){}
  33.                  System.out.println(Thread.currentThread().getName()+"----show : "+ tick--);
  34.            }
  35.     }
  36. }

  37. class ThisLockDemo
  38. {
  39.        public static void main(String[] args)
  40.        {
  41.               Ticket t = new Ticket();

  42.               Thread t1 = new Thread(t);
  43.               Thread t2 = new Thread(t);

  44.               t1.start();
  45.               try{Thread.sleep(10);}catch(Exception e){}
  46.               t.flag = false;
  47.               t2.start();
  48.       }
  49. }
  50. /*
  51. 为什么我的输出结果总是这个:
  52. Thread-0....sale : 20
  53. Thread-0....sale : 19
  54. Thread-0....sale : 18
  55. Thread-0....sale : 17
  56. Thread-0....sale : 16
  57. Thread-0....sale : 15
  58. Thread-0....sale : 14
  59. Thread-0....sale : 13
  60. Thread-0....sale : 12
  61. Thread-0....sale : 11
  62. Thread-0....sale : 10
  63. Thread-0....sale : 9
  64. Thread-0....sale : 8
  65. Thread-0....sale : 7
  66. Thread-0....sale : 6
  67. Thread-0....sale : 5
  68. Thread-0....sale : 4
  69. Thread-0....sale : 3
  70. Thread-0....sale : 2
  71. Thread-0....sale : 1
  72. 把ticket改成很大的数也是一样。
  73. 只能输出*sale : *的结果,而不能输出show的,
  74. 同样的代码毕老师的两种都能输出。

  75. 是电脑问题还是我这代码中有点不合理之处,求大伙帮忙解决,真的很急!!!!!!
  76. */
复制代码

11.jpg (96.19 KB, 下载次数: 0)

11.jpg

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报

  1. <P>class Ticket implements Runnable

  2. {

  3.      private int tick = 300;

  4.      Object obj = new Object();

  5.      boolean flag = true;

  6.      public void run()

  7.      {

  8.           if(flag)

  9.          {

  10.                while(true)

  11.               {

  12.                     synchronized(this)

  13.                     {

  14.                           if(tick>0)

  15.                          {

  16.                                 try{Thread.sleep(10);}catch(Exception e){}

  17.                                 System.out.println(Thread.currentThread().getName()+"....sale : "+ tick--);

  18.                          }

  19.                     }

  20.               }

  21.        }

  22.        else

  23.             while (true)

  24.              {

  25.                    show();

  26.              }

  27.     }

  28.     public synchronized void show()

  29.     {

  30.             if(tick>0)

  31.            {

  32.                  try{Thread.sleep(10);}catch(Exception e){}

  33.                  System.out.println(Thread.currentThread().getName()+"----show : "+ tick--);

  34.            }

  35.     }

  36. }



  37. class ThisLockDemo

  38. {

  39.        public static void main(String[] args)

  40.        {

  41.               Ticket t = new Ticket();



  42.               Thread t1 = new Thread(t);

  43.               Thread t2 = new Thread(t);



  44.               t1.start();

  45.               try{Thread.sleep(10);}catch(Exception e){}

  46.               t.flag = false;

  47.               t2.start();

  48.       }

  49. }
  50. <IMG border=0 alt="" src="http://bbs.itheima.com/forum.php?mod=image&aid=21399&size=300x300&key=3b3b98a44360f57b&nocache=yes&type=fixnone" aid="attachimg_21399"></P>
  51. <P>发现还是不行。。。。可能我电脑真的有问题。。。</P>
复制代码

`3MN[2~[%AOK8I_({9SK8JY.jpg (177.84 KB, 下载次数: 0)

`3MN[2~[%AOK8I_({9SK8JY.jpg
回复 使用道具 举报

谢谢你认真的回答
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马