java - scjp:线程相关问题

标签 java multithreading wait notify scjp

下面是问题...

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/

相关文章:

linux - 当使用 wait 系统调用时

java - 在 Java 中计算耗时时收到 NaN

java - 仅在用户输入给出"is"后才结束循环 - Java

c# - 如何中止/取消 TPL 任务?

c - WaitForSingleObject 是否用作内存屏障?

windows-7 - SWI Prolog 中的文件异常处理和等待进程

java - 等待服务器给出的答复给定的时间

java - 获取 "WELD-001408 Unsatisfied dependencies error when deploying a class injected with an interface"

java - 如何配置 Jetspeed 用户密码验证

java - wait() 不会释放所有当前锁,如何实现?