zoukankan      html  css  js  c++  java
  • java wait方法

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

  • 相关阅读:
    JavaScript Eval 函数使用
    WPFToolkit Calendar & DatePicker 使用介绍
    Windows Mobile 6.5 配置环境,数据库访问,部署简单实例
    ThreadPool.QueueUserWorkItem 方法 (WaitCallback)
    Windws Mobile 6.5 Professional ADO.NET数据访问
    WPF调用Web Services
    c#中Interface的理解
    PagesSection.MaintainScrollPositionOnPostBack 属性
    EclipseRCP中文语言包版本不一致,导致导出错误
    SWT美化开源控件网站
  • 原文地址:https://www.cnblogs.com/keyi/p/11982737.html
Copyright © 2011-2022 走看看