1

这是我遇到问题的代码-

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=5aMethod.

4

3 回答 3

4

当你执行时wait,你的线程释放锁并进入等待状态。此时允许其他线程进入该方法。您正在使用单个实例,Runnable因此当一个线程将其设置为 5 时,这就是另一个线程读取的内容。

于 2012-07-15T11:40:02.670 回答
2

1. wait立即释放锁,并将锁交给其他线程。

2. 只有在到达同步块的右括号时notify才会释放锁。

3.由于这里只有一个Runnable实例,它在i = 5之后,当同步块结束时......然后释放锁。

于 2012-07-15T11:43:33.190 回答
0

这段代码没有做wait-notify模式。该Thread.currentThread().wait()调用会抛出一个IllegalMonitorStateException,该run方法会捕获并忽略它。两者都T1抛出T2此异常,因此您看不到Exiting aMethod打印的行。

notify调用bMethod被浪费了,因为没有wait线程在rr Runnable.

于 2012-07-19T08:02:01.213 回答