锁定老帖子 主题:Effective Java的一小段代码
精华帖 (0) :: 良好帖 (1) :: 新手帖 (5) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-11-23
我用楼主的代码试了一下,刷完牙后回来看还是一直在跑的,然后我又重新运行了一遍再去洗了把脸回来还是不会停止。
用的是junit测试滴 |
|
返回顶楼 | |
发表时间:2011-11-23
顺带一题,测试的原因是为了想求证多核心是否会有影响,结果是不会同时呢,因为我的是corei7 4核心8线程的
|
|
返回顶楼 | |
发表时间:2011-11-23
多线程编程中有个关键字volatile,你去看看它的作用就知道了为什么了。
|
|
返回顶楼 | |
发表时间: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核的,程序退出完全正常,不一定与书上描述的一致。 |
|
返回顶楼 | |
发表时间:2011-11-23
我想强调的是,你要让你的程序跑在一个不稳定状态吗?并不是说哪种状态是正确的,或者谁对谁错的问题。
|
|
返回顶楼 | |
发表时间:2011-11-24
Cross_Lee 写道 看书看到这一段代码,书上的意思这个backgroundThread永远不会终止,但是我在机器上跑了下,发现1秒之后程序停止了。我的理解是main线程结束,分出来的子线程都跟着结束。为什么书上说永远不会结束。而且我实验了下是会终止的。有知道的解释下,谢谢各位!
有书的可以看Effective Java 中文版 第二版的230页。 不好意思,因为没仔细看楼主的文字,我误解了楼主的意思,“main线程结束,分出来的子线程都跟着结束”这是最基本概念的错误。 |
|
返回顶楼 | |
发表时间:2011-11-24
好像要java命令开启服务器端就是对的了
java -server 是不是这个,不记得了 |
|
返回顶楼 | |
发表时间:2011-11-24
你改一下
Thread backgroundThread = new Thread(new Runnable(){ public void run(){ int i = 0; while(true){ i++; } } }); 就会发现主进程和其他进程的停止是没有关联的。 |
|
返回顶楼 | |
发表时间:2011-11-24
主线程和自己创建的线程是并发的,当主线程结束了的时候,自己建的线程也就结束了。
|
|
返回顶楼 | |
发表时间:2011-11-24
对于java程序来说只要含有一个前台线程没有结束,那整个进程就不会结束
默认情况下 backgroundThread线程是一个前台线程 ,可以设置setDaemon(true);指定为一个后台进程,这边当main主线程结束,接着就是前台线程backgroundThread结束,那么整个程序也应该结束吧 |
|
返回顶楼 | |