请教一个关于Java抛出异常问题,在线等!!

迷失在太空 2007-08-08 05:47:22
运行如下程序抛出异常:
public class Agg {
public static void main(String argv[]) {
Agg a = new Agg();
a.go();
}
public void go() {
DSRoss ds1 = new DSRoss("one");
ds1.start();
}
}

class DSRoss extends Thread {
private String sTname = "";
DSRoss(String s) {
sTname = s;
}
public void run() {
notwait();
System.out.println("finished");
}

public void notwait() {
while (true) {
try {
System.out.println("waiting");
wait();
}
catch (InterruptedException ie) {
}
System.out.println(sTname);
notifyAll();
}
}
}
调试的时候提示wait()这里有错误:Object synchronization method was called from an unsynchronized block of code.
请问为什么这里错误,如何更改呢?
...全文
339 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
dd379980649 2007-08-08
  • 打赏
  • 举报
回复
在我的机子上运行后
D:\java\new>java Agg
waiting
Exception in thread "Thread-0"

java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:484)
at DSRoss.notwait(Agg.java:26)
at DSRoss.run(Agg.java:18)

抛出的"IllegalMonitorStateException"异常 查API=="抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程."

也就是说该线程没有指定对象监视器.
通过以下三种方法之一,线程可以成为此对象监视器的所有者:
1:通过执行此对象的同步 (Sychronized) 实例方法。
2:通过执行在此对象上进行同步的 synchronized 语句的正文。
3:对于 Class 类型的对象,可以通过执行该类的同步静态方法。
!!一次只能有一个线程拥有对象的监视器。

也就是说你的程序在执行到wait()发现"当前的线程不是此对象监视器的所有者".所以解决的办法 因该是让当前线程成为此对象监视器的所有者. 按方法1来做:

改后的代码为:
public synchronized void notwait() {
while (true) {
try {
System.out.println("waiting");
wait(2000);
}
catch (InterruptedException ie) {
}
System.out.println(sTname);
notifyAll();
}
}
应该这样就可以了~~

我也是新手 刚刚学习,发点意见讨论讨论.要有错误还请指教哈!!
奋斗并快乐着 2007-08-08
  • 打赏
  • 举报
回复
跟着回答一样的答案有意思吗?
btw,wait方法可以不带参数
awusoft 2007-08-08
  • 打赏
  • 举报
回复
wait() 方法只能在同步方法或者同步区块中调用!
tyztyz1006 2007-08-08
  • 打赏
  • 举报
回复
wait 是在 同步控制线成时使用的
而且括号里面要加上毫妙数..
joejoe1991 2007-08-08
  • 打赏
  • 举报
回复
wait() 方法只能在同步方法或者同步区块中调用!

62,623

社区成员

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

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