我使用了两个类
第一堂课:专柜
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就应该启动子线程,但事实并非如此。为什么?
答案 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