在构造函数中使用start()创建对象后,线程应该已经开始运行

时间:2017-10-01 10:18:31

标签: java multithreading

我使用了两个类

第一堂课:专柜

public class Counter {
int val = 0;
void inc() { val++;}
void dcr() { val--;}
}

第二课:threadTesting

public class ThreadTesting extends Thread {

/**
 * @param args the command line arguments
 */
Counter c;
ThreadTesting(Counter c){
    this.c = c;
    start();
}

public void run(){
    for(int i=0;i<10000;i++)
        c.dcr();
}
public static void main(String[] args) throws Exception {
    // TODO code application logic here
    Counter c = new Counter();
    ThreadTesting rc = new ThreadTesting(c);
    Boolean stateOfThread = rc.isAlive();
    System.out.println(stateOfThread);
    for(int i=0;i<10000;i++)
       c.inc();
    rc.join();

    System.out.println("Final value of c.val: "+c.val);
}

}

如果我评论这些代码

 Boolean stateOfThread = rc.isAlive();
    System.out.println(stateOfThread);
    for(int i=0;i<10000;i++)
       c.inc();
    rc.join();

我得到的结果是0,但是一旦我创建了对象rc就应该启动子线程,但事实并非如此。为什么?

1 个答案:

答案 0 :(得分:1)

如果您对上述语句进行注释,构造函数仍会启动第二个线程,但在第二个线程的System.out.println("Final value of c.val: "+c.val);方法启动之前,主线程上会执​​行run()。因此,打印输出时c.val仍为0

在该print语句之前添加Thread.sleep(1000),您将看到第二个线程正在运行。

您最有可能获得以下输出:

Final value of c.val: -10000