object not locked by thread before wait()

zuibunan14 2011-08-03 04:39:28
如上,我想让一个正在执行的线程停下来,就调用了 thread.wait 方法,但是显示如上的错误,不知道错误原因,顺便问下使线程停止运行并且还可以重启应该采用什么方法?
...全文
21319 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
安卓机器人 2011-08-06
  • 打赏
  • 举报
回复
嗯,独特的见解,好东西啊
zuibunan14 2011-08-06
  • 打赏
  • 举报
回复
好的,我试试看, 谢谢各位!
qybao 2011-08-04
  • 打赏
  • 举报
回复
可以试试看
syncronized(this) { //把wait代码放在synchronized块中,锁线程自己
wait(1000); //锁一定的时间,要不然没有notify就一直wait了
}
BadPattern 2011-08-04
  • 打赏
  • 举报
回复
楼上正解,应该调用lock对象的wait方法:lock.wait()而不是线程的wait方法
如果没有在同步块中调用wait,会报IllegalMonitorStateException,而楼主报的不是这个异常。
线程中止并重启,这个...线程中止可以让标记线程的变量置为false,从外部调用方法中止线程,重启嘛,你重新执行一下run方法中的代码不就好了。

shine333 2011-08-04
  • 打赏
  • 举报
回复
楼主对Object.wait方法理解错了吧。

wait不是针对线程Thread/Runnable的,而是针对锁对象的

假设某个Object lock = new Object();
线程1(比如消费者线程)调用lock.wait()方法后,线程1就停下,直到其他某个线程(比如生产者线程)调用了lock.notify()或者lock.notifyAll();唤醒一个或者多个等待lock被唤醒的线程(此例中的线程1)。
调用wait之前,需要对lock同步synchronized (lock) {...}

如果只是想让当前线程停下一段时间
Thread.sleep(毫秒数)
dyf6372 2011-08-04
  • 打赏
  • 举报
回复
对 要想用wait方法必须先加同步锁
zuibunan14 2011-08-04
  • 打赏
  • 举报
回复
主要是 Sleep 之后还会占用 CPU 资源,而貌似等待就不会
meran 2011-08-03
  • 打赏
  • 举报
回复
按你这个问题是这样的。。。但是 wait notify 用于同步操作,典型的同步原语啊。 让它中断线程用 interrupt(),或者可以让他睡眠 sleep
daijope 2011-08-03
  • 打赏
  • 举报
回复 2
方法前要加synchronized锁定,即是必须先加锁,然后再调用wait(),notify()方法。必须的,,,,

62,622

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧