黑马程序员技术交流社区

标题: 多线程的小问题 [打印本页]

作者: CHJ    时间: 2013-9-21 13:34
标题: 多线程的小问题
本帖最后由 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()呢?

作者: loading……99.9    时间: 2013-9-21 14:34
因为你主线程休眠10毫秒后,f才被设置成false,而t1已经进入while死循环到中了,即使f为false,但是在t1线程中还是始终执行while循环。
作者: CHJ    时间: 2013-9-21 15:12
loading……99.9 发表于 2013-9-21 14:34
因为你主线程休眠10毫秒后,f才被设置成false,而t1已经进入while死循环到中了,即使f为false,但是在t1线程 ...

谢了{:soso_e112:}




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