【发布时间】:2012-03-05 18:35:44
【问题描述】:
参考以下代码
public void acquire(){
synchronized(a){
print("acquire()");
try{
//Thread.sleep(5000);
synchronized(this){
wait(5000);
}
print("I have awoken");
print("" + a);
}catch(Exception e){
e.printStackTrace();
}
}
print("Leaving acquire()");
}
public void modify(int n){
print("Entered in modfy");
synchronized(a){
try{
//Thread.sleep(5000);
synchronized(this){
wait(5000);
}
this.a=n;
print("new value" + a);
}catch(Exception e){
e.printStackTrace();
}
}
}
和
final SynchoTest ttObj = new SynchoTest();
Thread A = new Thread(new Runnable(){
public void run() {
ttObj.acquire();
}
},"A");
Thread B = new Thread(new Runnable(){
public void run() {
ttObj.modify(97);
}
},"B");
A.start();
B.start();
据我所知,wait(n) 会暂停线程,直到调用 notify()/notifyAll() 或指定的时间 n 结束。
但是……
- 在上述方法中,如果我像使用 Thread.sleep(n) 一样直接使用 wait(n), 我得到运行时异常。
- 如果我同步这两种方法而不是围绕 wait(n) 同步块然后我没有得到任何异常,但两者 线程被永久阻塞。
- 但如果我愿意,我附加了 ie wait(n) 与 synchronized 块,它工作正常。
请告诉我为什么?还告诉我,如果我使用 sleep(n) 而不是 wait(n),为什么它在定位同步块上的行为没有什么不同?
我的问题是关于等待(n)在同步关键字不同位置的各种结果。
@格雷
notify() 或 notifyAll(),且 wait() 必须在同步块中 对于你正在等待的对象
解释了为什么我通过将同步块定位在不同位置而得到运行时异常。
现在请解释一下,为什么
public void method(){
synchronized(a){
synchronized(this){
wait(n);
}
}
}
工作正常。但是
public synchronized void method(){
synchronized(a){
wait(n);
}
}
永远阻塞了我的线程。
【问题讨论】:
-
当你说线程永远被阻塞时,你的意思是你因为没有线程启动而被卡在空白屏幕上?
thread.start() -
您是否考虑过阅读 Javadoc 中的内容?
-
@noMAD 是的。我打印了线程状态。它说它被阻止了。
标签: java multithreading