java wait方法

Posted 泥古拉斯赵四

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java wait方法相关的知识,希望对你有一定的参考价值。

接上一篇文章,https://www.cnblogs.com/liumy/p/11633065.html

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

可以看下面的例子。

 1 package com.citi.test.mutiplethread.demo0503;
 2 
 3 import java.util.Date;
 4 
 5 public class WaitTest {
 6     public static void main(String[] args) {
 7         ThreadA t1=new ThreadA("t1");
 8         System.out.println("t1:"+t1);
 9         synchronized (t1) {
10             try {
11                 //启动线程
12                 System.out.println(Thread.currentThread().getName()+" start t1");
13                 t1.start();
14                 //主线程等待t1通过notify唤醒。
15                 System.out.println(Thread.currentThread().getName()+" wait()"+ new Date());
16                 t1.wait();// 不是使t1线程等待,而是当前执行wait的线程等待
17                 System.out.println(Thread.currentThread().getName()+" continue"+ new Date());
18             } catch (Exception e) {
19                 e.printStackTrace();
20             }
21         }
22     }
23 }
24 
25 class ThreadA extends Thread{
26     public ThreadA(String name) {
27         super(name);
28     }
29     @Override
30     public void run() {
31         synchronized (this) {
32             System.out.println("this:"+this);
33             try {
34                 Thread.sleep(2000);//使当前线程阻塞1秒
35             } catch (InterruptedException e) {
36                 // TODO Auto-generated catch block
37                 e.printStackTrace();
38             }
39             System.out.println(Thread.currentThread().getName()+" call notify()");
40             this.notify();
41         }
42     }
43 }

 

下面是执行结果。

 

 

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

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

这样就导致了32行到40行的代码必须在main主线程释放锁的时候才运行,而t1.await()就释放了锁,所以我们看执行结果。

32行在15行之后执行。

17行会等待t1线程执行完毕调用notify之后再执行。

这里就说明了, 

在代码中t1.await(),是让运行这行代码的线程等待,而不是让t1这个线程等待。

 

参考资料:

https://www.jianshu.com/p/def7f016dd5e

 

以上是关于java wait方法的主要内容,如果未能解决你的问题,请参考以下文章

java的notify方法为啥也要同步

Java并发编程之二彻底理解Java的wait和Notify机制

Java中的sleep()和wait()异同

JAVA多线程之wait/notify

Java中wait和sleep方法的区别

Java——多线程高并发系列之wait()notify()notifyAll()interrupt()