黑马程序员技术交流社区

标题: 多线程的小程序-输出结果有出入,大家帮忙看一下! [打印本页]

作者: 刘基军    时间: 2011-12-8 16:25
标题: 多线程的小程序-输出结果有出入,大家帮忙看一下!
本帖最后由 monghuan 于 2011-12-8 18:46 编辑

  1. import java.util.Calendar;

  2. class ClockTest implements Runnable
  3. {       
  4.         private Calendar calendar = Calendar.getInstance();
  5.         private int year = calendar.get(Calendar.YEAR);
  6.   private int month = calendar.get(Calendar.MONTH)+1;
  7.   private int day = calendar.get(Calendar.DAY_OF_MONTH);
  8.         private int hour = calendar.get(Calendar.HOUR_OF_DAY);
  9.   private int minute = calendar.get(Calendar.MINUTE);       
  10.   
  11.   private int count=0;
  12.         private boolean flag = true;
  13.        
  14.         public void run()
  15.         {
  16.                
  17.                 while(true)
  18.                 {
  19.                         synchronized(this)
  20.                         {
  21.                                 if(flag)
  22.                                 {
  23.                                         try
  24.                                         {                                                               
  25.                                
  26.                                                 System.out.println(year+"-"+month+"-"+day+"-"+hour+"-"+minute+"-"+Thread.currentThread().getName());
  27.                                                 count++;
  28.                                                 Thread.sleep(1000);                                                                                                                       
  29.                                                 if(count==5)
  30.                                                 {
  31.                                                         flag=false;
  32.                                                         count=0;
  33.                                                         notify();
  34.                                                         wait();                                                       
  35.                                                 }       
  36.                                         }
  37.                                         catch(Exception e)
  38.                                         {
  39.                                                 System.out.println(e.toString());       
  40.                                         }                                       
  41.                                 }
  42.                                 else
  43.                                 {                                                       
  44.                                         try
  45.                                         {
  46.                                                 flag=true;
  47.                                                 System.out.println("整点时间为:"+year+"-"+month+"-"+day+"-"+hour+"-"+minute+"-"+Thread.currentThread().getName());
  48.                                                 System.out.println("整点时间为:"+year+"-"+month+"-"+day+"-"+hour+"-"+minute+"-"+Thread.currentThread().getName());                                       
  49.                                                 notify();
  50.                                                 wait();       
  51.                                         }
  52.                                         catch(Exception e)
  53.                                         {
  54.                                                 System.out.println(e.toString());       
  55.                                         }               
  56.                                 }
  57.                         }
  58.                        
  59.                 }
  60.         }       
  61. }

  62. public class Main
  63. {
  64.         public static void main(String [] args)
  65.         {               
  66.                 ClockTest ct = new ClockTest();
  67.                 Thread t1 = new Thread(ct);
  68.                 Thread t2 = new Thread(ct);
  69.                 t1.start();       
  70.                 t2.start();               
  71.         }
  72. }
复制代码
输出结果如下:
  1. D:\>javac Main.java

  2. D:\>java Main
  3. 2011-12-8-16-18-Thread-0
  4. 2011-12-8-16-18-Thread-0
  5. 2011-12-8-16-18-Thread-1 //??搞不懂为何出现线程1,求解惑?
  6. 2011-12-8-16-18-Thread-1
  7. 2011-12-8-16-18-Thread-1
  8. 整点时间为:2011-12-8-16-18-Thread-0
  9. 整点时间为:2011-12-8-16-18-Thread-0
  10. 2011-12-8-16-18-Thread-1
  11. 2011-12-8-16-18-Thread-1
  12. 2011-12-8-16-18-Thread-1
  13. 2011-12-8-16-18-Thread-1
  14. 2011-12-8-16-18-Thread-1
  15. 整点时间为:2011-12-8-16-18-Thread-0
  16. 整点时间为:2011-12-8-16-18-Thread-0
  17. ......
复制代码

作者: 小春同学    时间: 2011-12-8 16:47
本帖最后由 hello西卡够 于 2011-12-8 16:55 编辑

这个当然会有线程1了,因为当你线程0在同步代码块里还没有执行满5次,就跳出去了,就释放了this锁,然后被Thread-1抢到了,很正常嘛。如果你的想法是一个线程单独跑5次,可以在进去的时候(打印前)加一句while(country<5)的判断,把if(count==5)删了。
作者: 刘基军    时间: 2011-12-8 17:25
hello西卡够 发表于 2011-12-8 16:47
这个当然会有线程1了,因为当你线程0在同步代码块里还没有执行满5次,就跳出去了,就释放了this锁,然后被T ...

谢谢你的分析,确实存在这个问题,呵呵,代码已修改
  1. import java.util.Calendar;

  2. class ClockTest implements Runnable
  3. {       
  4.         private Calendar calendar = Calendar.getInstance();
  5.         private int year = calendar.get(Calendar.YEAR);
  6.   private int month = calendar.get(Calendar.MONTH)+1;
  7.   private int day = calendar.get(Calendar.DAY_OF_MONTH);
  8.         private int hour = calendar.get(Calendar.HOUR_OF_DAY);
  9.   private int minute = calendar.get(Calendar.MINUTE);       
  10.   
  11.   private int count=0;
  12.         private boolean flag = true;
  13.        
  14.         public void run()
  15.         {
  16.                
  17.                 while(true)
  18.                 {
  19.                         synchronized(this)
  20.                         {
  21.                                 if(flag)
  22.                                 {
  23.                                         try
  24.                                         {                                                                                                                                                                                                                       
  25.                                                 while(count<5)
  26.                                                 {
  27.                                                         System.out.println(year+"-"+month+"-"+day+"-"+hour+"-"+minute+"-"+Thread.currentThread().getName());
  28.                                                         count++;
  29.                                                         Thread.sleep(1000);       
  30.                                                         if(count==5)
  31.                                                         {
  32.                                                                 flag=false;
  33.                                                                 count=0;
  34.                                                                 notify();
  35.                                                                 wait();       
  36.                                                         }                                                               
  37.                                                 }       
  38.                                                        
  39.                                         }
  40.                                         catch(Exception e)
  41.                                         {
  42.                                                 System.out.println(e.toString());       
  43.                                         }                                       
  44.                                 }
  45.                                 else
  46.                                 {                                                       
  47.                                         try
  48.                                         {
  49.                                                 flag=true;
  50.                                                 System.out.println("整点时间为:"+year+"-"+month+"-"+day+"-"+hour+"-"+minute+"-"+Thread.currentThread().getName());
  51.                                                 System.out.println("整点时间为:"+year+"-"+month+"-"+day+"-"+hour+"-"+minute+"-"+Thread.currentThread().getName());                                       
  52.                                                 notify();
  53.                                                 wait();       
  54.                                         }
  55.                                         catch(Exception e)
  56.                                         {
  57.                                                 System.out.println(e.toString());       
  58.                                         }               
  59.                                 }
  60.                         }
  61.                        
  62.                 }
  63.         }       
  64. }

  65. public class Main
  66. {
  67.         public static void main(String [] args)
  68.         {               
  69.                 ClockTest ct = new ClockTest();
  70.                 Thread t1 = new Thread(ct);
  71.                 Thread t2 = new Thread(ct);
  72.                 t1.start();       
  73.                 t2.start();               
  74.         }
  75. }
复制代码

作者: 杨强    时间: 2011-12-8 17:58
额 没来得及啊
作者: 刘基军    时间: 2011-12-8 18:00
杨强 发表于 2011-12-8 17:58
额 没来得及啊

可以继续提意见,呵呵
作者: 杨强    时间: 2011-12-8 18:06
monghuan 发表于 2011-12-8 18:00
可以继续提意见,呵呵

{:3_53:}{:3_53:}{:3_53:}没有了呢




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