锁定老帖子 主题:Effective Java的一小段代码
精华帖 (0) :: 良好帖 (1) :: 新手帖 (5) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-11-23
有书的可以看Effective Java 中文版 第二版的230页。 import java.util.concurrent.TimeUnit; /** * @author gl65293 * */ public class StopThread { /** * @param args */ 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(!stopRequested){ i++; } } }); backgroundThread.start(); TimeUnit.SECONDS.sleep(1); stopRequested = true; } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-11-23
Cross_Lee 写道 看书看到这一段代码,书上的意思这个backgroundThread永远不会终止,但是我在机器上跑了下,发现1秒之后程序停止了。我的理解是main线程结束,分出来的子线程都跟着结束。为什么书上说永远不会结束。而且我实验了下是会终止的。有知道的解释下,谢谢各位!
有书的可以看Effective Java 中文版 第二版的230页。 import java.util.concurrent.TimeUnit; /** * @author gl65293 * */ public class StopThread { /** * @param args */ 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(!stopRequested){ i++; } } }); backgroundThread.start(); TimeUnit.SECONDS.sleep(1); stopRequested = true; } } 大家来说说啊,别沉了。 |
|
返回顶楼 | |
发表时间:2011-11-23
守护线程才不会停止
|
|
返回顶楼 | |
发表时间:2011-11-23
最后修改:2011-11-23
在我的机子上是一直不停的, Fedora 16 java 1.6
我觉得这应该是虚拟机相关的。 |
|
返回顶楼 | |
发表时间:2011-11-23
我的也是停了,求解
|
|
返回顶楼 | |
发表时间:2011-11-23
nicowyh 写道 守护线程才不会停止
能说具体点吗? 书上的意思是:给这个stopRequested 用synchronized包起来,那个backgroundThread就会停止了。但是我跑1L的代码还是会停止。 |
|
返回顶楼 | |
发表时间:2011-11-23
biAji 写道 在我的机子上是一直不停的, Fedora 16 java 1.6
我觉得这应该是虚拟机相关的。 backgroundThread 不停止吗?? 你用什么编译器跑的? |
|
返回顶楼 | |
发表时间:2011-11-23
是书太老了
|
|
返回顶楼 | |
发表时间:2011-11-23
Cross_Lee 写道 看书看到这一段代码,书上的意思这个backgroundThread永远不会终止,但是我在机器上跑了下,发现1秒之后程序停止了。我的理解是main线程结束,分出来的子线程都跟着结束。为什么书上说永远不会结束。而且我实验了下是会终止的。有知道的解释下,谢谢各位!
有书的可以看Effective Java 中文版 第二版的230页。 import java.util.concurrent.TimeUnit; /** * @author gl65293 * */ public class StopThread { /** * @param args */ 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(!stopRequested){ i++; } } }); backgroundThread.start(); TimeUnit.SECONDS.sleep(1); stopRequested = true; } } Joshua Bloch解释的比较清楚吧,编译器有可能会把它优化成 while(true){ i++; } 你要把你的程序放在一个不确定的状态吗? |
|
返回顶楼 | |
发表时间:2011-11-23
Cross_Lee 写道 看书看到这一段代码,书上的意思这个backgroundThread永远不会终止,但是我在机器上跑了下,发现1秒之后程序停止了。我的理解是main线程结束,分出来的子线程都跟着结束。为什么书上说永远不会结束。而且我实验了下是会终止的。有知道的解释下,谢谢各位!
有书的可以看Effective Java 中文版 第二版的230页。 import java.util.concurrent.TimeUnit; /** * @author gl65293 * */ public class StopThread { /** * @param args */ 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(!stopRequested){ i++; } } }); backgroundThread.start(); TimeUnit.SECONDS.sleep(1); stopRequested = true; } } java线程不是抢占式模型,是协同式线程模型,这段程序如果在单核单线程cpu下应该不会停止的,因为main线程没有执行的机会,stopRequested = true这个语句也就不会执行。不过在多核cpu下就不一定了,主线程和backgroundThread可能会同时执行。 |
|
返回顶楼 | |