线程wait, notify使用错误java.lang.IllegalMonitorStateException 本帖最后由 ameyume 于 2010-11-14 17:37:22 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没用wait,notify之前是点击下一首时,我都是重新new一个DelayThread(200);但这样连续点击下一首时,就死机了。 wait:等待对象的同步锁,需要获得该对象的同步锁才可以调用这个方法,否则后收到一个 IllegalMonitorStateException,这个是运行时异常.调用这个方法后,就放弃了这个同步锁了.如果不带参数的wait方法就只 有等别人唤醒了,如果带一个参数的化就设置等待最长时间,过了这个时间即使没有人唤醒这个线程也不再等待了.notify:唤醒在等待该对象同步锁的线程(只唤醒一个,如果有多个在等待),但是notifyAll可以唤醒所有等待的线程,注意唤醒的时在notify之前wait的线程,之后的没有效果. # 调用obj的wait(), notify()方法前,必须获得obj锁,也就是必须写在synchronized(obj) {...} 代码段内。 synchronized(this){ try { dThread.wait(); // 暂停线程 }catch(InterruptedException e) { e.printStackTrace(); }}synchronized(this),会获得this的对象锁,dThread.wait()会让该调用线程wait在dThread对象的等待池中,然后该线程会释放dThread锁,由于线程没有dThread对象锁,所以会报IllegalMonitorStateException。同样的道理适合notify(),notifyAll().所以可以这样写:synchronized(dThread){ try { dThread.wait(); // 暂停线程 }catch(InterruptedException e) { e.printStackTrace(); }}synchronized(dThread){ dThread.notify(); // 恢复线程} wait的目的就在于暴露出对象锁,让其他线程可以通过对象的notify叫醒等待在该对象的等该池里的线程。同样notify也会释放对象锁,在调用之前必须获得对象的锁,不然也会报异常。 Button的selector问题 SQLiteDatabase.query函数的作用及参数的含义 Android中的SearchView,如何去掉其后面的那个X按钮? 如何 获得其他应用 的permission Android4.0.1源代码编译的问题 如何在JAVA代码中,使表格中的单元格跨行? 新手提问:关于GridView和BaseAdapter 两个view以拖动方式切换,该如何实现? 关于Listview菜鸟问题 android studio运行虚拟机报错,求大神帮助 android怎样实现如360手机安全卫士桌面上的图标 按钮响应点击事件
但这样连续点击下一首时,就死机了。
化就设置等待最长时间,过了这个时间即使没有人唤醒这个线程也不再等待了.
notify:唤醒在等待该对象同步锁的线程(只唤醒一个,如果有多个在等待),但是notifyAll可以唤醒所有等待的线程,注意唤醒的时在notify之前wait的线程,之后的没有效果.
{
try {
dThread.wait(); // 暂停线程
}catch(InterruptedException e) {
e.printStackTrace();
}
}
synchronized(this),会获得this的对象锁,dThread.wait()会让该调用线程wait在dThread对象的等待池中,然后该线程会释放dThread锁,由于线程没有dThread对象锁,所以会报IllegalMonitorStateException。同样的道理适合notify(),notifyAll().
所以可以这样写:
synchronized(dThread)
{
try {
dThread.wait(); // 暂停线程
}catch(InterruptedException e) {
e.printStackTrace();
}
}
synchronized(dThread)
{
dThread.notify(); // 恢复线程
}
wait的目的就在于暴露出对象锁,让其他线程可以通过对象的notify叫醒等待在该对象的等该池里的线程。同样notify也会释放对象锁,在调用之前必须获得对象的锁,不然也会报异常。