作者:手机用户2502885633 | 来源:互联网 | 2023-02-05 09:48
HI编写了一个示例程序,用于测试java中的wait行为.
我的Runnable实现:
class ThreadWait implements Runnable {
Object lock = new Object();
ThreadWait(Object lock){
this.lock = lock;
}
@Override
public void run() {
try {
synchronized (lock){
System.out.println("Started : "+Thread.currentThread().getName());
wait();
System.out.println("Completed : "+Thread.currentThread().getName());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在我的main
喜欢中使用:
Object lock = new Object();
ThreadWait t1 = new ThreadWait(lock);
ThreadWait t2 = new ThreadWait(lock);
Thread a= new Thread(t1);
a.setName("A");
Thread b= new Thread(t2);
b.setName("B");
a.start();
b.start();
运行此程序时,我收到此异常:
Exception in thread "A" Exception in thread "B" java.lang.IllegalMonitorStateException
Started : A
at java.lang.Object.wait(Native Method)
Started : B
at java.lang.Object.wait(Object.java:502)
at ThreadWait.run(SynchronizedExample.java:34)
at java.lang.Thread.run(Thread.java:745)
java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:502)
at ThreadWait.run(SynchronizedExample.java:34)
at java.lang.Thread.run(Thread.java:745)
GhostCat say..
6
您的问题是您已同步lock
,但您正在等待this
(特别是:包含等待调用的Runnable实例).
您只能在拥有监视器的对象上调用wait.你的代码拥有lock
,但不是this
!
所以你应该等待锁定对象.但请注意:那么你的代码就会陷入僵局!
这导致了建议:你应该多研究一下"理论".你看,可以使用wait/notify来"同步"应该在同一数据上工作的不同线程; 但这不是你通过反复试验(有效地)学到的东西; 因为有太多微妙的细节会影响试验和错误实验的结果.你可能会在这里或那里开始阅读.
最后一句话:理解,是的,等待/通知是重要的概念也很重要; 但你很少在"现实世界"中使用它们.这些是非常低级的机制,Java在它们之上添加了更强大的抽象.
1> GhostCat say..:
您的问题是您已同步lock
,但您正在等待this
(特别是:包含等待调用的Runnable实例).
您只能在拥有监视器的对象上调用wait.你的代码拥有lock
,但不是this
!
所以你应该等待锁定对象.但请注意:那么你的代码就会陷入僵局!
这导致了建议:你应该多研究一下"理论".你看,可以使用wait/notify来"同步"应该在同一数据上工作的不同线程; 但这不是你通过反复试验(有效地)学到的东西; 因为有太多微妙的细节会影响试验和错误实验的结果.你可能会在这里或那里开始阅读.
最后一句话:理解,是的,等待/通知是重要的概念也很重要; 但你很少在"现实世界"中使用它们.这些是非常低级的机制,Java在它们之上添加了更强大的抽象.