Java的Object.wait(long)在等待时间过去后会继续往后执行吗
Java的Object.wait(long)在等待时间过去后会继续往后执行吗
Object.wait(long)方法相比于wait,多了个等待时长,那么当等待时长过去后,线程会继续往下执行吗?
- 单个线程执行
- 多个线程并发执行
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)在等待时间过去后会继续往后执行吗的更多相关文章
- Java:Object类详解
Java的一些特性会让初学者感到困惑,但在有经验的开发者眼中,却是合情合理的.例如,新手可能不会理解Object类.这篇文章分成三个部分讲跟Object类及其方法有关的问题. 上帝类 问:什么是Obj ...
- 理解JAVA - 面向对象(object) - 属性,方法
理解JAVA - 面向对象(object) - 属性,方法 多态的体现: 向上造型,父类接收子类对象:向上造型: 从父类角度看不到子类独有的方法:面向对象,人类认知世界的方式:生活中每天都 ...
- Java class,Object,Class的区别
代码: http://www.cnblogs.com/hongdada/p/6060487.html package com.company; public class Main { public s ...
- centos 解压jdk安装包方式安装jdk 出现 java/lang/NoClassDefFoundError: java/lang/Object 错误
安装完JDK ,设定环境变量后出现这个错误: [root@localhost lib]# javacError occurred during initialization of VMjava/lan ...
- Java总结篇系列:java.lang.Object
从本篇开始,将对Java中各知识点进行一次具体总结,以便对以往的Java知识进行一次回顾,同时在总结的过程中加深对Java的理解. Java作为一个庞大的知识体系,涉及到的知识点繁多,本文将从Java ...
- 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 ...
- 解决本机安装多版本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 ...
- 使用eclipse JDT compile class,解决 无法确定 X 的类型参数;对于上限为 X,java.lang.Object 的类型变量 X,不存在唯一最大实例
ant 命令行方式执行build javac编译class出现 泛型无法转换 无法确定 <X>X 的类型参数:对于上限为 X,java.lang.Object 的类型变量 X,不存在唯一最 ...
- Error occurred during initialization of VM java/lang/NoClassDefFoundError: java/lang/Object
本地原来已经安装了JAVA JDK1.7并配置好了环境变量; 然后又安装了JDK8,想2个版本并存. 然后发现eclipse 打不开,闪退.然后查看环境: 发现 C:\Users\Administra ...
随机推荐
- 借助Python来实现的定量城市研究
一.数据处理基础 (一)数据分析的概念 城市数据分析,可以从数据分析的广义和狭义两个角度来看: 狭义的数据分析是指根据分析目的,采用对比分析.分组分析.交叉分析和回归分析等分析方法,对相关城市数据(包 ...
- Pie 杭电1969 二分
My birthday is coming up and traditionally I'm serving pie. Not just one pie, no, I have a number N ...
- 【转】动态规划之最长公共子序列(LCS)
[原文链接]最长公共子序列(Longest Common Subsequence,简称 LCS)是一道非常经典的面试题目,因为它的解法是典型的二维动态规划,大部分比较困难的字符串问题都和这个问题一个套 ...
- js中string转map的方法
例如: var r = "{'msg':'你好'}" ; var map = eval("("+r+")"); //r为String类型的数 ...
- Linux工程师必备的系统监控工具
WGCLOUD基于java语言开发,是微服务架构构建监控系统,支持高并发高性能高可用,核心模块包括:服务器集群监控,ES集群状态监控,CPU监控,内存监控,数据监控(mysql,postgresql, ...
- web自动化中pytest框架的使用(二)---参数化
1.pytest--参数化 在测试用例的前面加上@pytest.mark.parametrize("参数名",列表数据) 参数名:用来接收每一项数据,并作为测试用例的参数 列表数据 ...
- CSS选择器与CSS的继承,层叠和特殊性
什么是选择器?选择器{样式;},在{}之前的部分就是"选择器","选择器"指明了{}中的"样式"的作用对象,也就是"样式" ...
- synchronized 代码块怎么用
加不加 synchronized 有什么区别? synchronized 作为悲观锁,锁住了什么? 之前 2 篇文章我们已经知道 synchronized 的使用方法以及锁的内容(实例对象和Class ...
- auth权限逻辑
下面本人为大家讲解一下如何实现auth权限, 第一步,新建Auth.php,复制下面的代码,把注释中的表都创建一下.把文件放到extend新建文件夹org放进去即可, <?php // +--- ...
- 2019-2020-1 20199310《Linux内核原理与分析》第六周作业
1.问题描述 在前面的文章中,学习了系统调用的相关理论知识,并使用库函数API和C代码中嵌入汇编代码两种方式使用getpid()系统调用.本文将内容围绕系统调用system_call的处理过程,在Me ...