在run()

时间:2015-08-16 17:57:40

标签: java multithreading

我创建了一个java线程并将堆栈引用传递给它的构造函数, 初始化线程堆栈引用。 在run方法中,我已经用该堆栈对象创建了一个synchronized块, 当我在synchronized块中运行调用wait时,我收到了IllegalMonitorStateException。

线程类:

public class Producer extends Thread {

Stack<String> stack=null;

public Producer(Stack<String> stack) {
    this.stack=stack;
}

@Override
public void run() {

    synchronized (stack) {
        if(stack.isEmpty()){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }       
}
}

主类:

public class MainClass {

public static void main(String[] args) {

    Stack<String> stack=new Stack<String>();

    Producer p=new Producer(stack);
    p.start();
}
}

输出:

Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at demo.Producer.run(Producer.java:20)

1 个答案:

答案 0 :(得分:1)

要使wait()(或notify())起作用,必须在同一对象上调用它。你现在拥有的与

相同
$(document).ready(function() {
    $('#edit-button').click(function() {
        var jsonObj = {};
        $('section').each(function() {
            var section = {};

            $(this).find('[contenteditable="true"]').each(function() {
                section[$(this).attr('id')] = $(this).html();
            });

            jsonObj[$(this).attr('id')] = section;
        });
        alert(JSON.stringify(jsonObj));
    });
});
而你应该做

 synchronized (stack) {
    if(stack.isEmpty()){
        try {
            this.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
 }  

注意:等待可以虚假地唤醒您在循环中执行此操作,否则您的方法可能会过早返回。

 synchronized (stack) {
    if(stack.isEmpty()){
        try {
            stack.wait(); // wait on the same object synchronized.
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
 }