我创建了一个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)
答案 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();
}
}
}