论坛首页 Java企业应用论坛

Effective Java的一小段代码

浏览 16801 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (5) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-11-23  
我用楼主的代码试了一下,刷完牙后回来看还是一直在跑的,然后我又重新运行了一遍再去洗了把脸回来还是不会停止。
用的是junit测试滴
0 请登录后投票
   发表时间:2011-11-23  
顺带一题,测试的原因是为了想求证多核心是否会有影响,结果是不会同时呢,因为我的是corei7 4核心8线程的
0 请登录后投票
   发表时间:2011-11-23  
多线程编程中有个关键字volatile,你去看看它的作用就知道了为什么了。
0 请登录后投票
   发表时间:2011-11-23   最后修改:2011-11-23
package com.ppsoft;

import java.util.concurrent.TimeUnit;

public class StopThread
{
  private static boolean stopRequested;

  public static void main(String[] args)
    throws InterruptedException
  {
    Thread backgroundThread = new Thread(new Runnable() {
      public void run() {
        int i = 0;
        while (!StopThread.stopRequested)
          i++;
      }
    });
    backgroundThread.start();

    TimeUnit.SECONDS.sleep(1L);
    stopRequested = true;
  }
}

编译器优化只是程序不退出的一个可能的原因,我电脑是多核的,不过我给该Java进程分配了一个cpu,这是我反编译的代码,可以看到编译器没有进行任何优化,程序还是一样不会退出,说明这里不仅仅和编译优化有关,还与Java线程模型有关。

总结一下:如果编译器没有优化(编译器优化手工开启,具体我也不知道),加上你的电脑cpu又是n核的,程序退出完全正常,不一定与书上描述的一致。
0 请登录后投票
   发表时间:2011-11-23  
我想强调的是,你要让你的程序跑在一个不稳定状态吗?并不是说哪种状态是正确的,或者谁对谁错的问题。
0 请登录后投票
   发表时间:2011-11-24  
Cross_Lee 写道
看书看到这一段代码,书上的意思这个backgroundThread永远不会终止,但是我在机器上跑了下,发现1秒之后程序停止了。我的理解是main线程结束,分出来的子线程都跟着结束。为什么书上说永远不会结束。而且我实验了下是会终止的。有知道的解释下,谢谢各位!

有书的可以看Effective Java 中文版 第二版的230页。

不好意思,因为没仔细看楼主的文字,我误解了楼主的意思,“main线程结束,分出来的子线程都跟着结束”这是最基本概念的错误。
0 请登录后投票
   发表时间:2011-11-24  
好像要java命令开启服务器端就是对的了
java -server 是不是这个,不记得了
0 请登录后投票
   发表时间:2011-11-24  
你改一下
Thread backgroundThread = new Thread(new Runnable(){  
            public void run(){  
                int i = 0;  
                while(true){  
                    i++;  
                }  
            }  
        });  
就会发现主进程和其他进程的停止是没有关联的。
0 请登录后投票
   发表时间:2011-11-24  
主线程和自己创建的线程是并发的,当主线程结束了的时候,自己建的线程也就结束了。
0 请登录后投票
   发表时间:2011-11-24  
对于java程序来说只要含有一个前台线程没有结束,那整个进程就不会结束
默认情况下 backgroundThread线程是一个前台线程  ,可以设置setDaemon(true);指定为一个后台进程,这边当main主线程结束,接着就是前台线程backgroundThread结束,那么整个程序也应该结束吧
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics