java wait方法_java wait方法

本文详细解析了Java中的wait()方法如何使当前执行线程而非指定线程t等待,以及在多线程环境下,它如何配合synchronized和notify方法实现线程间的协作。通过实例演示了wait如何影响主线程与子线程的执行流程。
摘要由CSDN通过智能技术生成

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

可以看下面的例子。

48304ba5e6f9fe08f3fa1abda7d326ab.png

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 }

48304ba5e6f9fe08f3fa1abda7d326ab.png

下面是执行结果。

d40fcdd996eee8efaafdcc98cecb6696.png

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

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

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

32行在15行之后执行。

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

这里就说明了,

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值