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

java wait方法的更多相关文章

  1. Java:方法的参数是传值还是传引用

    Java中方法的参数总是采用传值的方式. 下列方法欲实现对象的交换,但实际上是不能实现的. public void swap(simpleClass a,simpleClass b){ simpleC ...

  2. Java之方法重载篇(我重载了,你要如何来调用我。。)

      一.课前引言 请看一下代码,你发现什么特殊之处了吗? public class MethodOverload { public static void main(String[] args) { ...

  3. effective java —— 终结方法守卫者

    目录: effective java —— 终结方法守卫者 effective java 第2章:创建和销毁对象.第7条 : 避免使用终结方法.最后的“终结方法守卫者 (finalizer guard ...

  4. Java parseInt()方法

    1.Java parseInt()方法 使用此方法得到的原始数据类型的一个特定的字符串. parseXxx()是一个静态方法,可以有一个参数或两个. java parseInt() 语法:   sta ...

  5. 几种任务调度的 Java 实现方法与比较

    综观目前的 Web 应用,多数应用都具备任务调度的功能.本文由浅入深介绍了几种任务调度的 Java 实现方法,包括 Timer,Scheduler, Quartz 以及 JCron Tab,并对其优缺 ...

  6. JNI系列——C文件中的方法调用Java中方法

    1.创建xxx.jni包并在该包下实现一些Java的方法,和要调用的本地方法 2.实现MainActivity中的按钮点击事件-即点击按钮调用本地的方法 3.在C文件中的方法中回调Java的方法 3. ...

  7. java中方法参数的一些总结(1)

    1.问题说明        在C++中,函数调用时有传值调用和传址调用两种方式,但在Java中只有传值调用一种方式.Java中的方法参数为那几种基本数据类型的情况跟C++中一样,传入的只是变量的拷贝. ...

  8. 新手容易混乱的String+和StringBuffer,以及Java的方法参数传递方式。

    之前在交流群里和猿友们讨论string+和stringbuffer哪个速度快以及Java的方法参数传递的问题,引起了群里猿友的小讨论.最终LZ得出的结果是string+没有stringbuffer快, ...

  9. JAVA本地方法详解,什么是JAVA本地方法?

    一. 什么是Native Method   简单地讲,一个Native Method就是一个java调用非java代码的接口.一个Native Method是这样一个java的方法:该方法的实现由非j ...

  10. Java replace() 方法

    Java replace() 方法 Java String类 replace() 方法通过用 newChar 字符替换字符串中出现的所有 oldChar 字符,并返回替换后的新字符串. 语法 publ ...

随机推荐

  1. 下拉框等需要显示上下箭头切换的CSS样式

    下拉框等需要显示上下箭头切换的CSS样式   .icon-right, .icon-down, .icon-up { display: inline-block; padding-right: 13r ...

  2. OCR6:Custom Traineddata

    参考:https://groups.google.com/forum/#!msg/tesseract-ocr/MSYezIbckvs/kO1VoNKMDMQJ V4版本代码示例 : import py ...

  3. Nmon监控性能分析

    一.CPU信息 1.折线图中蓝线为cpu占有率变化情况:粉线为磁盘IO的变化情况: 2.下面表各种左边的位磁盘的总体数据,包括如下几个: Avg tps during an interval 每个间隔 ...

  4. Docker 0x07: Docke 容器网络

    目录 Docke 容器网络 Container Network Model (CNM) 具体项目中代码对象有哪些 Implementations实现的网络(直接英文版) Libnetwork incl ...

  5. CR TubeGet 0.9.2.7,YouTube&全网视频终极下载

    数十次迭代,终于功能完善,在youtube-dl原生支持基础之上,自写解析器脚本,实现对其它主流网站视频下载支持. 加入对视频播放列表.缩略图.字幕下载支持,甚至于自定义列表设计.加密视频下载. 支持 ...

  6. 记python 使用腾讯ocr 识别代码报错 CERTIFICATE_VERIFY_FAILED

    腾讯提供的demo测试通过  写入到代码出现 ClientNetworkError? [TencentCloudSDKException] code:ClientNetworkError messag ...

  7. linux命令实现在当前文件夹下面模糊搜索文件

    在当前文件中查找包含的字符串 find . -name "*.txt" | xargs grep 'abc' ,例如:查找txt文件中包含字符串a的字符串

  8. 说说openjdk及G1回收器日志内容详细分析

    谈谈openjdk: 在正式往下学习JVM之前,这里谈谈openjdk这个网站,这个在学习java并发时也用过它来分析过锁的底层实现,如:https://www.cnblogs.com/webor20 ...

  9. Intellij IDEA运行报Command line is too long解法

    修改项目下 .idea\workspace.xml,找到标签 <component name="PropertiesComponent"> , 在标签里加一行  < ...

  10. 别名alias永久生效别名alias永久生效;虚拟机的NAT模式,进行静态IP配置,并A、B的实现免密访问

    别名alias永久生效 1.打开cd /etc/profile.d 目录 新建文件my_alias.sh 2.my_alias.sh里面添加 alias p=’poweroff -h’ alias r ...