这是我遇到问题的代码 -
public class WaitTest {
public static void main(String[] args) {
Runner rr = new Runner();
Thread t1 = new Thread(rr,"T1");
Thread t2 = new Thread(rr,"T2");
t1.start();
t2.start();
}
}
class Runner implements Runnable{
int i=0;
public void run(){
try{
if(Thread.currentThread().getName().equals("T1")){
bMethod();
aMethod();
}
else{
aMethod();
bMethod();
}
}catch(Exception e){}
}
public synchronized void aMethod() throws Exception{
System.out.println("i="+i+",Now going to Wait in aMethod "+Thread.currentThread().getName());
Thread.currentThread().wait();
System.out.println("Exiting aMethod "+Thread.currentThread().getName());
}
public synchronized void bMethod() throws Exception{
System.out.println("i="+i+",Now going to Wait bMethod "+Thread.currentThread().getName());
i=5;
notifyAll();
System.out.println("Exiting bMethod "+Thread.currentThread().getName());
}
}
输出结果为:
i=0,Now going to Wait bMethod T1
Exiting bMethod T1
i=5,Now going to Wait in aMethod T1
i=5,Now going to Wait in aMethod T2
我的问题是:
为什么T2进入
中的aMethod
而T1
在里面等待?以及为什么T2
打印i=5
aMethod.
答案 0 :(得分:4)
当您执行wait
时,您的线程会释放锁并进入等待状态。此时允许另一个线程进入该方法。您正在使用Runnable
的单个实例,因此当一个线程将其设置为5时,这就是另一个线程读取的内容。
答案 1 :(得分:2)
1。 wait
将立即释放锁,并将锁定移至另一个主题。
2。 notify
仅在同步块的右括号时释放锁定
到了。
3。由于此处只有一个Runnable实例,因此在i = 5之后,当synchronized块结束时......然后释放锁定。
答案 2 :(得分:0)
此代码未执行wait-notify
模式。 Thread.currentThread().wait()
调用会抛出IllegalMonitorStateException
,run
方法会捕获并忽略该T1
。 T2
和Exiting aMethod
都会抛出此异常,因此您看不到打印的行notify
。
bMethod
中的wait
来电被浪费了,因为rr Runnable
的内在锁上没有任何线程{{1}}。