web之家  

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这个线程等待。

posted on 2019-12-04 14:37  路修远而求索  阅读(4851)  评论(0编辑  收藏  举报