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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杜成龙 中级黑马   /  2013-6-16 19:28  /  1862 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

程序如下:

  1. <DIV class=blockcode>
  2. <BLOCKQUOTE>class StopThread implements Runnable
  3. {
  4.        boolean flag=true;
  5.        public void run()
  6.       {
  7.            while (flag)
  8.           {
  9.               System.out.println(Thread.currentThread().getName()+"......run");
  10.           }
  11.       }
  12.      public void changeFlag()
  13.      {
  14.          flag=false;
  15.      }
  16. }

  17. class StopThreadDemo
  18. {
  19.      public static void main(String[] args)
  20.      {
  21.           StopThread st=new StopThread();
  22.           Thread t1=new Thread(st);
  23.           Thread t2=new Thread(st);
  24.           t1.start();
  25.           t2.start();
  26.           int x=0;
  27.           while(true)
  28.          {
  29.               if(x++==60)
  30.              {
  31.                  st.changeFlag();
  32.                  break;
  33.              }
  34.              System.out.println(Thread.currentThread().getName()+"............."+x);
  35.          }
  36.      }
  37. }
复制代码
运行结果如下:

记得毕老师讲过,用while去判断flag,就可以让while循环中内容先去判断flag,
如果为true,执行while中的语句,如果为false,则不会执行while中的语句,如果
按照这一理论,当x=60后,flag被改成false,那么while中的线程应该先判断flag为
false,就不会再输出Thread-1.......run和Thread-0........run了,但是运行结果每次
输出,这是为什么呢?并且最后都是输出两个。请大家帮忙看下,谢谢啦~~




评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1 神马都是浮云

查看全部评分

6 个回复

倒序浏览
这里面涉及到线程安全问题了,

31.              if(x++==60)

32.             {

33.                 st.changeFlag();//当程序执行到这一步的时候,被其他线程抢走了,所以会出现这种问题, 用同步能解决这一问题。

34.                 break;

35.             }

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

回复 使用道具 举报
学习学习!
回复 使用道具 举报
主要还是跟主线程抢到执行权时,另外两个线程执行到的位置有关系:
在主线程设置好结束标志后,那两个线程可能已经判断过flag了, 正要执行这句话System.out.println(Thread.currentThread().getName()+"......run");
所以才会有那样的结果,我安装楼主的代码,在 System.out.println(Thread.currentThread().getName()+"......run");这句话后面加了个拖延时间语句,
就可以看到楼主想要的结果了:但还是不能保证主线程结束后,还出现另外两线程的情况

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
多运行几次,你就会发现每次输出的结果并不一定是一样的。。
回复 使用道具 举报
这个还是有多线程的安全问题,你看11天的多线程安全问题就有讲到。。比如线程1在if(x++==60)刚进去,就挂了,接着2执行结束了就算改变flag为false,这时候1接着执行 她的flag是true,所以还会执行下去一次,就有可能是Thread-1。。。存在多线程安全隐患。需要给她写个锁,同步代码块,这样就不会了,详细的你看视频就全都有了,嘿嘿!,

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

回复 使用道具 举报
楼主您好~帖子长时间未作出回答,我已经将您的帖子改成已解决。如果有问题的话可以私密我哦~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马