下面是问题...
void waitForSignal() {
Object obj = new Object();
synchronized (Thread.currentThread()) {
obj.wait();
obj.notify();
}
}
哪种说法是正确的?
A.此代码可能会引发 InterruptedException
。
B.此代码可能会抛出 IllegalMonitorStateException
。
C.此代码可能会在十分钟后引发 TimeoutException
。
D.颠倒 obj.wait() 和 obj.notify() 的顺序可能会导致此方法正常完成。
E.从另一个线程调用 notify()
或 notifyAll()
可能会导致此方法正常完成。
F.除非将 obj.wait()
替换为 ((Thread) obj).wait()
,否则此代码不会编译。
答案是B。但是当我以下面的方式执行时得到A。请帮忙。
public class ThreadStateProblem extends Thread {
public void run() {
}
void waitForSignal() {
Object obj = new Object();
synchronized (Thread.currentThread()) {
obj.wait();
obj.notify();
}
}
public static void main(String []s) {
new ThreadStateProblem().start();
new ThreadStateProblem().waitForSignal();
}
}
并且还尝试了以下:
public class ThreadStateProblem extends Thread {
public void run() {
}
void waitForSignal() {
Object obj = new Object();
synchronized (Thread.currentThread()) {
obj.wait();
obj.notify();
}
}
public static void main(String []s) {
ThreadStateProblem sd =new ThreadStateProblem();
sd.start();
sd.waitForSignal();
}
}
最佳答案
此代码无法编译。答案 A 意味着代码在运行时会抛出 InterruptedException。您的代码有一个编译错误,其中 obj.wait 可以抛出 InterruptedException,并且该异常未得到处理,并且该方法未声明为抛出它,因此该类无法编译。所以答案 A 在这里不适用。
当然,问题中的代码也有同样的问题。所以这个问题似乎有缺陷。
一旦修复了编译错误,并将 waitForSignal 调用移至线程的 run 方法中,以便由 sd 线程而不是主线程调用它,您应该得到如下内容:
public class ThreadStateProblem extends Thread {
public void run() {
waitForSignal();
}
void waitForSignal() {
Object obj = new Object();
synchronized (Thread.currentThread()) {
try {
obj.wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
}
obj.notify();
}
}
public static void main(String []s) {
ThreadStateProblem sd =new ThreadStateProblem();
sd.start();
}
}
那么你应该得到预期的结果:
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:503)
at ThreadStateProblem.waitForSignal(ThreadStateProblem.java:10)
at ThreadStateProblem.run(ThreadStateProblem.java:3)
关于java - scjp:线程相关问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21915853/