对于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工具网来进行一下了解吧!
推荐阅读: