码迷,mamicode.com
首页 > 编程语言 > 详细

java wait方法

时间:2019-10-08 22:17:43      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:int   extends   而不是   rri   bsp   call   img   线程阻塞   interrupt   

接上一篇文章,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方法

标签:int   extends   而不是   rri   bsp   call   img   线程阻塞   interrupt   

原文地址:https://www.cnblogs.com/liumy/p/11637950.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!