即使在通知当前线程之后,下面的代码也不会执行(使用此).
public synchronized void test() {
String str = new String();
try {
System.out.println("Test1");
this.wait();
this.notifyAll();
System.out.println("Test2");
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("Inside exception");
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
我只Test1在控制台上输出.
在第二种情况下,如果我在字符串对象上调用wait方法,我会得到异常.原因是因为字符串类对象str没有锁定当前对象.但我想知道str.wait()实际意味着什么?
public synchronized void test() {
String str = "ABC";
try {
System.out.println("Test1");
str.wait();
str.notifyAll();
System.out.println("Test2");
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("Ins");
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
控制台输出:
> Test1
java.lang.IllegalMonitorStateException
Run Code Online (Sandbox Code Playgroud)
不确定您对该代码的期望:
wait做了它所说的:它等待,所以notifyAll永远不会被调用wait不先保存该对象的监视器,则无法调用对象.所以你需要在一个synchronized(str)块中以避免异常.但你仍然会遇到与1相同的问题.的主要用途的情况下wait和notify为线程间通信,即,一个线程等待而另一个线程通知等待的线程可以唤醒.在您的情况下,相同的线程位于通信通道的两端,不起作用.
| 归档时间: |
|
| 查看次数: |
688 次 |
| 最近记录: |