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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© CHJ 中级黑马   /  2013-9-21 13:34  /  785 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 CHJ 于 2013-9-21 15:11 编辑
  1. class Ticket implements Runnable
  2. {
  3.         private static int tick = 1000;
  4.         //Object obj = new Object();
  5.         boolean f = true;

  6.         public void run()
  7.         {
  8.                 if (f)
  9.                 {               
  10.                         while(true)
  11.                         {
  12.                                 synchronized(Ticket.class)
  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.                                 show();
  25.         }

  26.         public static synchronized void show()
  27.         {
  28.                 if(tick>0)
  29.                 {
  30.                         try{Thread.sleep(10);}catch(Exception e){}
  31.                         System.out.println(Thread.currentThread().getName()+"....show--- : "+ tick--);
  32.                 }
  33.         }
  34. }


  35. class  ThisLockDemo
  36. {
  37.         public static void main(String[] args)
  38.         {

  39.                 Ticket t = new Ticket();

  40.                 Thread t1 = new Thread(t);
  41.                 Thread t2 = new Thread(t);

  42.                 t1.start();
  43.                 try{Thread.sleep(10);}catch(Exception e){}//如果没有这行,t1、t2都会执行show(),那为什么加了这行,不是前10毫秒t1执行同步代码块,之后t1、t2都执行show()呢?
  44.                 t.f = false;
  45.                 t2.start();


  46.                 //t3.start();
  47.                 //t4.start();
  48.                 //Thread t3 = new Thread(t);
  49.                 //Thread t4 = new Thread(t);

  50.         }
  51. }
复制代码
try{Thread.sleep(10);}catch(Exception e){}---------如果没有这行,t1、t2都会执行show(),那为什么加了这行,不是前10毫秒t1执行同步代码块,之后t1、t2都执行show()呢?

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

2 个回复

倒序浏览
因为你主线程休眠10毫秒后,f才被设置成false,而t1已经进入while死循环到中了,即使f为false,但是在t1线程中还是始终执行while循环。

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
loading……99.9 发表于 2013-9-21 14:34
因为你主线程休眠10毫秒后,f才被设置成false,而t1已经进入while死循环到中了,即使f为false,但是在t1线程 ...

谢了{:soso_e112:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马