gpt4 book ai didi

java - scjp:线程相关问题

转载 作者:太空宇宙 更新时间:2023-11-04 07:02:19 25 4
gpt4 key购买 nike

下面是问题...

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com