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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Neverbelazy 中级黑马   /  2013-5-14 23:15  /  1877 人查看  /  18 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Neverbelazy 于 2013-5-15 00:39 编辑

有如下一段代码:
需求:newThread运行 判断 which(!flag) i++; 主函数设定过1秒钟,更改flag
结果, 按原始程序 newThread中 无限循环;a处代码不被运行到   System.out.println(i) 没有被打印
但是,如果b处按注释修改,则不会无限循环

------------------------------------------------------------------------------------------------
程序中看不出有什么问题,但是却有如此奇怪的结果, 请高手解答!
  1. public class ConcurrencyTest {
  2.           private static boolean flag;
  3.           public static void main(String[] args) throws InterruptedException {

  4.           Thread newThread=new Thread(new Runnable(){ //newThread线程构造
  5.            public void run(){
  6.                       int i=0;
  7.                       while(!flag)
  8.                             {  i++; }   // --> b. 可是,如果此句换成{ System.out.println(i++);} // 就可以打印出结果,程序循环打印一段后停止
  9.                       System.out.println(i); // --> a.  打印看i在多少的时候 flag被改变了
  10.                     }
  11.             });

  12.           newThread.start();
  13.           TimeUnit.SECONDS.sleep(1); // 挂起1秒
  14.           flag=true; // 改变flag企图让newThread的while循环停止
  15.           }
  16. }
复制代码
--------------- 由于2# xuemeng同学的误解,程序上加上了{ }, 以避免造成歧义 -------------
-------------------------------------- 不确定的答案 -------------------------------------------------------------
--------------- xuemeng同学的截图结果是正确的,那就暂时认为是JVM不同导致的吧---------------

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1

查看全部评分

18 个回复

倒序浏览
xuemeng 发表于 2013-5-14 23:41
粗心害死人, 哈哈!!1

01.public class ConcurrencyTest {


我就只想执行 i++;

while(!flag){i++;} //这样写也行

在主程序中,改变flag=true了 循环理应停止 然后 执行 System.out.println(i);

但是结果却 不是这样。。。
回复 使用道具 举报
xuemeng 发表于 2013-5-14 23:41
粗心害死人, 哈哈!!1

01.public class ConcurrencyTest {

是这样, 不要看我b的情况了,就是单独a的情况
while(!flag)
{i++;}
System.out.println(i); 在我的电脑上不能被打印这句,程序一直循环。

注: 我提出的b的情况只是让这个问题更奇怪, 因为换成b,竟然程序就在连续打印了0- n 后正常的停止了
回复 使用道具 举报
xuemeng 发表于 2013-5-14 23:56
你先看好,我的大括号是加在哪个位置的!!
运行一下我修改的代码   我的大括号是把
while (!flag) {

确实是一样的 就是因为你理解错了我的意思我才又加上的,,,比如就是 a 这种情况,我想知道你的电脑上是否能够打印出来 最后的这个 i;  
回复 使用道具 举报
xuemeng 发表于 2013-5-15 00:03
你运行一下我写的代码就清楚了,   你的while循环有个范围啊!!
   你只是把i++括起来, 那么它就只会执行i ...

额。。。。我清楚你的意思,我不想 把所有的 i 都打印

我只是奇怪为什么
while(!flag)
{i++;}
这句话会无限循环

但是
while(!flag)
{System.out.println(i++);}
就不会无限循环
回复 使用道具 举报
xuemeng 发表于 2013-5-15 00:15
while(!flag) {
    System.out.println(i++);
}

额,,,我已经认为是我电脑的问题了 好吧 我再解释一下

1. 我清楚 我希望的打印结果是     a. 当flag=true, 只打印最后一次 i;  b. 打印很多次,直到flag=true;
2. 但是,在我的电脑的实际情况   a. 无限循环,N久都不打印结果    b. 打印很多此,直到 flag=true;

所以,我才有了我的问题。

如果你的电脑上面,如你所说,是1.中期望的打印结果一样,可能就是我电脑JVM的问题了

我想等等看,是否还有别人也是和你得到一样的正常的结果

如果是,那就更确信了是我电脑JVM的问题
回复 使用道具 举报
xuemeng 发表于 2013-5-15 00:32
我的截图:  我截图的代码和你的源代码一模一样!  至于加在i++那里的大括号,那样加, 可有可无 ...

额 可能是JVM不一样吧 我决定放弃这个问题了。  :dizzy:
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马