Java的Object.wait(long)在等待时间过去后会继续往后执行吗

Object.wait(long)方法相比于wait,多了个等待时长,那么当等待时长过去后,线程会继续往下执行吗?

  1. 单个线程执行
  2. 多个线程并发执行
public class ThreadWaitDemo {

    public static final int WAIT_IN_SECONDS = 2;
public static final int NOTIFY_IN_SECONDS = 6; public static void main(String[] args) throws InterruptedException {
ThreadWaitDemo threadWait = new ThreadWaitDemo();
Thread a = new Thread(threadWait::justWaitAndPrint, "t1");
Thread b = new Thread(threadWait::justNotify, "t2");
a.start();
// ① 先注释这段,让t1自己执行
b.start();
} public synchronized void justWaitAndPrint() {
try {
System.out.println(Thread.currentThread().getName() + ": I am in"); System.out.println(Thread.currentThread().getName() + ": I am gonna wait");
long start = System.currentTimeMillis();
wait(WAIT_IN_SECONDS * 1000);
// 如果时间过了就可以解除等待状态的话,那么这里的时间间隔就会接近2s
System.out.println("wait end " + (System.currentTimeMillis() - start) / 1000.0 + "seconds");
} catch (Exception e) {
System.out.println(Thread.currentThread().getName() + ": Oops, something bad happen " + e);
} System.out.println(Thread.currentThread().getName() + ": I am out");
} public synchronized void justNotify() {
try {
TimeUnit.SECONDS.sleep(NOTIFY_IN_SECONDS);
System.out.println(Thread.currentThread().getName() + ": I am in");
} catch (Exception e) {
System.out.println(Thread.currentThread().getName() + ": Oops, something bad happen " + e);
} System.out.println(Thread.currentThread().getName() + ": I am out");
}
}
  • 第一种情况下,运行结果

    t1: I am in

    t1: I am gonna wait

    wait end 2.004seconds

    t1: I am out

  • 第二种情况下,运行结果

    t1: I am in

    t1: I am gonna wait

    t2: I am in

    t2: I am out

    wait end 6.002seconds // 等待时间会随NOTIFY_IN_SECONDS变化

    t1: I am out

结论:wait(long)在无锁竞争情况下,在等待时间过去后就直接重新获取锁,往后执行;但是在竞争条件下,都会等获取到锁了才可以往下执行

附:Java线程状态

Java的Thread类中定义了一个线程状态的枚举,State

      public enum State {
/**
* 线程还未启动
*/
NEW, /**
* Runnable的线程已经在JVM中执行了,但是可能还在等待OS的一些资源例如处理器
*/
RUNNABLE, /**
* 线程处于等待一个monitor锁的状态
* 1.等待进入synchronized块或方法
* 2.在调用Object.wait后重新进入同步块
*/
BLOCKED, /**
* 假设线程A进入waiting状态,事实上是等待其他的线程B去执行某个特殊的操作
* 可以让线程进入waiting状态的几种情况:
* 1.Object#wait() 等待线程B调用Object.notify()或者Object.notifyAll()
* 2.B.join() 等待线程B结束
* 3.LockSupport.park() 等待线程B调用LockSupport.unpark(A);
*/
WAITING, /**
* 有时间约束的线程等待状态
* 1. Thread.sleep}
* 2. Object.wait(long)
* 3. Thread.join(long)
* 4. LockSupport.parkNanos
* 5. LockSupport.parkUntil(long deadline)
*/
TIMED_WAITING, /**
* 终止状态,线程执行完毕
*/
TERMINATED;
}

Java的Object.wait(long)在等待时间过去后会继续往后执行吗的更多相关文章

  1. Java:Object类详解

    Java的一些特性会让初学者感到困惑,但在有经验的开发者眼中,却是合情合理的.例如,新手可能不会理解Object类.这篇文章分成三个部分讲跟Object类及其方法有关的问题. 上帝类 问:什么是Obj ...

  2. 理解JAVA - 面向对象(object) - 属性,方法

    理解JAVA - 面向对象(object) - 属性,方法 多态的体现:    向上造型,父类接收子类对象:向上造型:    从父类角度看不到子类独有的方法:面向对象,人类认知世界的方式:生活中每天都 ...

  3. Java class,Object,Class的区别

    代码: http://www.cnblogs.com/hongdada/p/6060487.html package com.company; public class Main { public s ...

  4. centos 解压jdk安装包方式安装jdk 出现 java/lang/NoClassDefFoundError: java/lang/Object 错误

    安装完JDK ,设定环境变量后出现这个错误: [root@localhost lib]# javacError occurred during initialization of VMjava/lan ...

  5. Java总结篇系列:java.lang.Object

    从本篇开始,将对Java中各知识点进行一次具体总结,以便对以往的Java知识进行一次回顾,同时在总结的过程中加深对Java的理解. Java作为一个庞大的知识体系,涉及到的知识点繁多,本文将从Java ...

  6. type parameters of <T>T cannot be determined; no unique maximal instance exists for type variable T with upper bounds int,java.lang.Object

    今天在进行代码检查的时候出现下面的异常: type parameters of <T>T cannot be determined; no unique maximal instance ...

  7. 解决本机安装多版本jdk导致The type java.lang.Object cannot be resolved It is indirectly referenced ...

    本机开始安装了jdk1.6,然后安装了jdk1.8 当在调自动化的时候,发现传入函数传参String类型,报错The type java.lang.Object cannot be resolved ...

  8. 使用eclipse JDT compile class,解决 无法确定 X 的类型参数;对于上限为 X,java.lang.Object 的类型变量 X,不存在唯一最大实例

    ant 命令行方式执行build javac编译class出现 泛型无法转换 无法确定 <X>X 的类型参数:对于上限为 X,java.lang.Object 的类型变量 X,不存在唯一最 ...

  9. Error occurred during initialization of VM java/lang/NoClassDefFoundError: java/lang/Object

    本地原来已经安装了JAVA JDK1.7并配置好了环境变量; 然后又安装了JDK8,想2个版本并存. 然后发现eclipse 打不开,闪退.然后查看环境: 发现 C:\Users\Administra ...

随机推荐

  1. ADO.NET 事务控制

    在ADO.NET 中,可以使用Connection 和Transaction 对象来控制事务.若要执行事务,请执行下列操作: 1.调用Connection 对象的BeginTransaction 方法 ...

  2. Sprint 3 : oxford project API 尝试

    本次Sprint我们大家主要在调研和尝试阶段,主要是对photo experience 中的语音接口部分进行相应的调研和分析. 工作进度: 1. 图像界面设计兆阳和敏龙的工作进一步推进,除去之前介绍的 ...

  3. 《工程热力学沈维道童钧耕第四版-带书签》高清pdf下载链接

    <工程热力学沈维道童钧耕第四版-带书签>高清pdf下载链接 百度网盘链接:https://pan.baidu.com/s/1dWksA8O3y2JSfIQy5lrU5g 提取码:7x9w ...

  4. vnpy源码阅读学习(9)回到OptionMaster

    回到OptionMaster 根据我们对APP调用的代码阅读,我们基本上知道了一个APP是如何被调用,那么我们回到OptionMaster学习下这个APP的实现. 看看结构 class OptionM ...

  5. 关于Sysinternals Suite

    sysinternals 的网站创立于1996年由Mark russinovich和布赖科格斯韦尔主办其先进的系统工具和技术资料·微软于2006年7月收购sysinternals公司 . 不管你是一个 ...

  6. 笔记本安装ubuntu18.08,解决过程中出现的各种问题

    笔记本安装ubuntu18.08,解决过程中出现的各种问题 1.做启动U盘 在官网下载要安装的镜像,使用软碟通制作U盘安装盘 文件 -- 打开 然后 启动 -- 写入硬盘映像 -- 选择你的u盘 -- ...

  7. 高质量动漫实时画质增强器Anime4K在mpv上的配置

    Anime4K地址 https://github.com/bloc97/Anime4K mpv地址  https://mpv.io/   这个要错峰下载,网速不太好 在C盘用户\..\AppData\ ...

  8. tp5中的input助手函数

    详见手册:https://www.kancloud.cn/manual/thinkphp5/118044

  9. springboot docker jenkins 自动化部署并上传镜像

    springboot + docker + jenkins自动化部署项目,jenkins.mysql.redis都是docker运行的,并且没有使用虚拟机,就在阿里云服务器(centos7)运行 1. ...

  10. 用三维的视角理解二维世界:完美解释meshgrid函数,三维曲面,等高线,看完你就懂了。...

    完美解释meshgrid函数,三维曲面,等高线 #用三维的视角理解二维世界 #完美解释meshgrid函数,三维曲面,等高线 import numpy as np import matplotlib. ...