下面是问题......
void waitForSignal() {
Object obj = new Object();
synchronized (Thread.currentThread()) {
obj.wait();
obj.notify();
}
}
哪种说法属实?
一个。此代码可以抛出InterruptedException
。
B中。此代码可以抛出IllegalMonitorStateException
。
℃。此代码可在十分钟后抛出TimeoutException
。
d。撤消obj.wait()
和obj.notify()
的顺序可能会导致此方法正常完成。
电子。从另一个线程调用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();
}
}
答案 0 :(得分:1)
此代码无法编译。答案A表示代码在运行时会抛出InterruptedException。您的代码有一个编译错误,其中obj.wait可以抛出InterruptedException并且不处理异常并且该方法未被声明为抛出它,因此该类无法编译。所以答案A不适用于此。
当然,问题的代码也有同样的问题。所以问题似乎有缺陷。
一旦你修复了编译错误,并将waitForSignal调用移到了Thread的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)
答案 1 :(得分:0)
只有当try and catch
包围现在出现在解释
- 如果调用wait()
的线程没有对象的锁定,则会抛出IllegalMonitorStateException
。
- 我们没有锁定obj,我们正在锁定当前的thread
对象。