2013-09-25 45 views
2

我有以下Java程序:说明对线程

public class A extends Thread { 
    int count; 

    @Override 
    public void run() { 
     while (true) 
      count++; 
    } 

    public static void main(String...strings){ 
     A obj = new A(); 
     obj.start(); 
     System.out.println("The value of count is " + obj.count); 
    } 
} 

当运行该程序的输出是:The value of count is 0(和程序保持运行)。就我对线程的理解而言,它应该在无限循环中运行,并且从不打印0.任何人都可以帮助我理解此程序的性质。

+0

如何为打印添加循环?不能保证增加计数的线程将在sysout之前被执行。但是,如果您在此处添加循环,则可能会看到计数增加。 – porfiriopartida

回答

4

线程几乎在System.out.println运行的同一时间开始,由于线程是后台,println不会等待它运行,因此您会看到count的初始值。

另外,count变量应该声明为volatile,以确保主线程sees changes to the variable在循环线程中产生。

+0

非常感谢你的解释,我不知道为什么我认为Main正在调用run,并且在控制返回之前它不会运行system.out。 – Ashish

+0

@Ashish:控制将有*从未*返回到主。 –

+0

是的,先生,我明白你的观点。对不起,这样一个愚蠢的错误,非常感谢你的帮助 – Ashish

1

“线程”没有执行打印,您的主要是。你期望发生什么?

您还应该使用某种保护,以便两个线程都可以安全地访问该变量。

+0

这里真的不需要“保护”,因为只有一个线程正在修改计数。当前的代码没有机会出现比赛或锁定。尽管为了防止主线程复制它,该变量应该被声明为volatile。 –

0

System.out调用不会只运行一次吗?

我会把System.out.println调用放在while循环中。

对于count,使用getter/setter方法可能会更好,并确保在任何给定时间只有其中一方能访问变量。