这些类在同一个文件中定义。什么是输出? (1 正确答案)
class Job extends Thread {
private Integer number = 0;
public void run() {
for (int i = 1; i < 1000000; i++) {
number++;
}
}
public Integer getNumber() {
return number;
}
}
public class Test {
public static void main(String[] args)
throws InterruptedException {
Job thread = new Job();
thread.start();
synchronized (thread) {
thread.wait();
}
System.out.println(thread.getNumber());
}
}
- 打印0。
- 打印999999。
- 不保证输出是上述任何一种。
输出为999999
。我理解当一个Thread完成它的run()
方法时,它会终止并随之释放Thread释放的所有锁。但是,在本练习中,它使用Thread对象作为锁,不应该将它视为普通对象吗?我的意思是锁不是由线程thread
拥有,而是由主线程拥有。
答案 0 :(得分:5)
此代码依赖于Java 7之前未记录的实现细节,现在(在documentation of the join()
method中),但使用以下单词:
当一个线程终止时,将调用this.notifyAll方法。建议应用程序不要在Thread实例上使用wait,notify或notifyAll。
所以我不知道这个问题在哪里被提出,但它真的测试你是否知道线程的隐藏角落,你永远不应该在任何理智的程序中使用。