zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    集合
    WPF自定义控件--模拟手机密码输入控件,在输入时显示最后一个输入密码字符
    配置VS不生成XML和PDB文件
    Wlan常见命令(可以查看连接密码)
    云栖社区用机器人爬CSDN的文章?
    Marshal.PtrToStringAnsi中文乱码
    各种手工DIY
    yii2修改默认控制器
    3D模型网站分享
    SemanticZoom配合GridView组件的使用关键点
  • 原文地址:https://www.cnblogs.com/liumy/p/11637950.html
Copyright © 2011-2022 走看看