java wait方法浅析

KLQ 2020-08-05 14:49:58 java常见问答 3146

对于java wait你都了解多少呢?下面的文章就是对java wait方法的一个简单介绍,具体的通过代码来了解哦,一起来看看吧。

wait方法是让当前线程等待,注意,这里的当前线程指的不是t,指的是主线程,wait会释放锁,等到其他线程调用notify方法的时候再继续运行。

下面可以一起通过下面的例子来了解一下。

例子:

package com.citi.test.mutiplethread.demo0503;
import java.util.Date;
public class WaitTest
{
    public static void main(String[] args)
    {
        ThreadA t1 = new ThreadA("t1");
        System.out.println("t1:" + t1);
        synchronized(t1)
        {
            try
            {
                //启动线程
                System.out.println(Thread.currentThread()
                    .getName() + " start t1");
                t1.start();
                //主线程等待t1通过notify唤醒。
                System.out.println(Thread.currentThread()
                    .getName() + " wait()" + new Date());
                t1.wait(); // 不是使t1线程等待,而是当前执行wait的线程等待
                System.out.println(Thread.currentThread()
                    .getName() + " continue" + new Date());
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }
}
class ThreadA extends Thread
{
    public ThreadA(String name)
    {
        super(name);
    }
    @Override
    public void run()
    {
        synchronized(this)
        {
            System.out.println("this:" + this);
            try
            {
                Thread.sleep(2000); //使当前线程阻塞1秒
            }
            catch (InterruptedException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread()
                .getName() + " call notify()");
            this.notify();
        }
    }
}

执行结果:

java wait方法

synchronized(this),和synchronized(t1),锁的是同一个对象。

这个程序一共有两个线程,一个是主线程main,另外一个是线程t1,所以会有锁的竞争,因为是main方法先运行到第9行,所以先获取到锁。

这样的话,就导致了32行到40行的代码必须在main主线程释放锁时才运行。

t1.await()释放了锁,所以看执行结果,32行在15行之后执行,17行会等待t1线程执行完毕调用notify之后再执行。

这里的话就说明了,代码中t1.await(),是让运行这行代码的线程等待,不是让t1这个线程等待。

以上就是全部的内容了,希望可以对你有所帮助,更多java常见问题及解决方法,请继续关注奇Q工具网来进行一下了解吧!

推荐阅读:

java多线程wait,notify浅析

java多线程有几种实现方法?java多线程实现的几种方式分享

java多线程代码实现,多线程简单例子分享