黑马程序员技术交流社区

标题: 这个多线程为什么会出现负数? [打印本页]

作者: liuhao_hm    时间: 2015-7-12 21:40
标题: 这个多线程为什么会出现负数?
本帖最后由 liuhao_hm 于 2015-7-12 22:35 编辑
  1. class Ticket implements Runnable
  2. {
  3.         private int num = 100;
  4.         boolean flag = true;

  5.         public void run()
  6.         {
  7.                 if(flag)
  8.                 {
  9.                         while(true)
  10.                         {
  11.                                 synchronized(this)
  12.                                 {
  13.                                         if(num>0)
  14.                                         {
  15.                                                 try
  16.                                                 {
  17.                                                         Thread.sleep(10);
  18.                                                 }
  19.                                                 catch (Exception e)
  20.                                                 {
  21.                                                 }
  22.                                                 System.out.println(Thread.currentThread().getName()+"..."+num--);
  23.                                         }
  24.                                 }
  25.                         }
  26.                 }
  27.                 else
  28.                 {
  29.                         while(true)
  30.                         {
  31.                                 show();
  32.                         }
  33.                 }
  34.         }
  35.         public synchronized void show()
  36.         {
  37.                 try
  38.                 {
  39.                         Thread.sleep(10);
  40.                 }
  41.                 catch (Exception  e)
  42.                 {
  43.                 }
  44.                 System.out.println(Thread.currentThread().getName()+"..show.."+num--);
  45.         }
  46. }
  47. class SynFunctionLockDemo
  48. {
  49.         public static void main(String[] args)
  50.         {
  51.                 Ticket t = new Ticket();
  52.                 Thread t1 = new Thread(t);
  53.                 Thread t2 = new Thread(t);
  54.                 t1.start();
  55.                 try
  56.                 {
  57.                         Thread.sleep(10);
  58.                 }
  59.                 catch (Exception e )
  60.                 {
  61.                 }
  62.                 t.flag = false;
  63.                 t2.start();

  64.         }
  65. }
复制代码

重写了N遍,只有一次运行的时候没有出现负数,其余都是运行的时候出现负数,实在找不到问题的所在了
作者: liuhao_hm    时间: 2015-7-12 21:41
运行结果
作者: 为了理想而奋斗    时间: 2015-7-12 22:47
synchronized(类名.class试试)


作者: 为了理想而奋斗    时间: 2015-7-12 22:49
我收回我上楼的话,楼主。你这是死循环啊。
作者: fmi110    时间: 2015-7-19 12:12
if(flag)
                {
                    。。。。。。。
                          if(num>0)
                  
                }
else
{
         while(true)
            {
这里缺少跳出语句的判断  if(num>0)
               show();
             }
}
作者: fmi110    时间: 2015-7-19 12:30
else语句中缺少判断为负值时不输出的语句
即        if(num>0)

如果线程刚好在第一个if语句被你终止,就不会出现负数了




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