论坛首页 Java企业应用论坛

Effective Java的一小段代码

浏览 16802 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (5) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-11-23  
看书看到这一段代码,书上的意思这个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  
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;
    }

}



大家来说说啊,别沉了。
0 请登录后投票
   发表时间:2011-11-23  
守护线程才不会停止
0 请登录后投票
   发表时间:2011-11-23   最后修改:2011-11-23
在我的机子上是一直不停的, Fedora 16 java 1.6

我觉得这应该是虚拟机相关的。
0 请登录后投票
   发表时间:2011-11-23  
我的也是停了,求解
0 请登录后投票
   发表时间:2011-11-23  
nicowyh 写道
守护线程才不会停止


能说具体点吗?

书上的意思是:给这个stopRequested 用synchronized包起来,那个backgroundThread就会停止了。但是我跑1L的代码还是会停止。
0 请登录后投票
   发表时间:2011-11-23  
biAji 写道
在我的机子上是一直不停的, Fedora 16 java 1.6

我觉得这应该是虚拟机相关的。



backgroundThread 不停止吗?? 你用什么编译器跑的?
0 请登录后投票
   发表时间:2011-11-23  
是书太老了

0 请登录后投票
   发表时间: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++;
}

你要把你的程序放在一个不确定的状态吗?
0 请登录后投票
   发表时间: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可能会同时执行。
0 请登录后投票
论坛首页 Java企业应用版

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