利用IDEA调试notify(),程序执行完毕,但一直不退出

在看Object源码的时候,看到wait()和notify(),顺手写了个demo,想验证wait()方法之后,线程放弃对象的锁,然后虽然验证了主线程确实获取到了对象锁,但是整个程序却没有退出,并且为必现。

具体代码如下:

public class App
{
    public static void main(String[] args)
    {
        Person person = new Person();
        Runnable runnable = new DemoRunnable(person);
        Thread thread = new Thread(runnable);
        thread.setName("TestThread");
        thread.start();
        System.out.println("Main thread end");
        synchronized (person)
        {
            System.out.println("Main Thread notify begin");
            person.notify();
            System.out.println("Main Thread notify end");
        }
    }
}
public class DemoRunnable implements Runnable
{
    private Person person;
    
    public DemoRunnable(Person person)
    {
        this.person = person;
    }
    
    @Override
    public void run()
    {
        try
        {
            synchronized (person)
            {
                System.out.println("Thread is begin");
                person.wait();
                System.out.println("Thread is end");
            }
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }
}

通过观察虚拟机,发现主线程main其实已经结束了,但是主线程中创建的TestThread并没有被唤醒,而是还在等待当中。

然后我们再看一下控制台的输出,其实就有点明白了。首先复习一下,线程状态关系(请看:https://blog.csdn.net/xingjing1226/article/details/81977129

事实上,这是由于2个线程执行异步执行造成的。线程在start()的时候,并不是立即运行(Running),而是成为就绪状态(Runnable),直到获取得到CPU的时间片才能执行,但是在我们main线程中,程序运行是很快的,直到执行完notify()之后,TestThread实际上都还没运行呢,更谈不上唤醒,因此TestThread一直处于等待状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值