对于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();
}
}
}
执行结果:
synchronized(this),和synchronized(t1),锁的是同一个对象。
这个程序一共有两个线程,一个是主线程main,另外一个是线程t1,所以会有锁的竞争,因为是main方法先运行到第9行,所以先获取到锁。
这样的话,就导致了32行到40行的代码必须在main主线程释放锁时才运行。
t1.await()释放了锁,所以看执行结果,32行在15行之后执行,17行会等待t1线程执行完毕调用notify之后再执行。
这里的话就说明了,代码中t1.await(),是让运行这行代码的线程等待,不是让t1这个线程等待。
以上就是全部的内容了,希望可以对你有所帮助,更多java常见问题及解决方法,请继续关注奇Q工具网来进行一下了解吧!
推荐阅读: