scjp:线程相关的问题

时间:2014-02-20 17:57:47

标签: java multithreading wait notify scjp

下面是问题......

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();
    }    
}  

2 个答案:

答案 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对象。

相关问题