import java.io.IOException;
public class Demo {
/**
* @param args
* @throws IOException
* @throws InterruptedException
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
T1 t1 = new T1();
T2 t2 = new T2(t1);
t1.start();
t2.start();
}
static Integer i = 0;
static class T1 extends Thread {
public void run() {
synchronized (i) {
System.out.println("T1-在syn里");
try {
i.wait(50L);//验证表明:wait时间到或被中断唤醒,不会继续执行或者跳到catch里
// (因为根本得不到执行,根本没法抛出InterruptedException,所以即使catch块放在syschronized外也一样 ),
//而是还需要等待获得锁。
//如果wait时间到或被中断唤醒,而T2还在syn里,那么T1还是会等待。
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("结束wait-T1");
System.out.println("T1-在syn里");
try {
Thread.sleep(10000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("T1-在syn里");
}
System.out.println("离开syn-T1");
}
}
static class T2 extends Thread {
Thread t1;
public T2(Thread t1){
this.t1 = t1;
}
public void run() {
synchronized (i) {
System.out.println("T2-在syn里");
try {
t1.interrupt();
Thread.sleep(10000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("T2-还在syn里");
}
System.out.println("T2-离开syn");
}
}
}
验证表明:
wait时间到或被中断唤醒,不一定会继续执行或者跳到catch里,而是还需要等待获得锁。
如果wait时间到或被中断唤醒,而T2还在syn里,那么T1还是会等待。
另外,Thread.interrupt()唤醒线程之后,其实是设置了Thead的中断状态,后续任何时候,当该线程尝试wait,join,sleep时,中断状态都会起作用,使得Thread被中断,wait/join/sleep方法会抛出中断异常(wait需要获取锁后才能继续抛出异常)。这点javadoc有说明。
_____________________________________________________________________________
package com.atell;
import java.io.IOException;
public class Demo {
public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
T1 t1 = new T1();
T2 t2 = new T2(t1);
t1.start();
t2.start();
}
static Integer i = 0;
static class T1 extends Thread {
public void run() {
synchronized (i) {
System.out.println("T1-syn-start");
try {
i.wait();// 可以被notify唤醒,也可以被interrupt唤醒,取决于T2中哪个操作先执行
} catch (InterruptedException e) {
System.out.println("在wait时被中断");
}
try {
Thread.sleep(2000L);
} catch (InterruptedException e) {
System.out.println("在sleep时被中断");
}
System.out.println("T1-syn-end");
}
System.out.println("离开syn-T1");
}
}
static class T2 extends Thread {
Thread t1;
public T2(Thread t1){
this.t1 = t1;
}
public void run() {
synchronized (i) {
System.out.println("T2-syn-start");
//(1)如果先interrupt再notify,那么i.wait会因为interrupt而醒过来,notify则不对它起作用(如果此时Monitor的等待队列有其他线程,则notify必须去唤醒其他线程,不能虚发- Java语言规范17.8.4最后一句明确提到。)。
//t1.interrupt();
//i.notify();
//(2)如果先notify再interrupt,那么i.wait会因为notify而醒过来,interrupt则对T1后续的sleep起作用。
i.notify();
t1.interrupt();
System.out.println("T2-syn-end");
}
System.out.println("T2-离开syn");
}
}
}
验证表明:
wait可以被notify唤醒,也可以被interrupt唤醒,取决于哪个操作先执行
(以上是看《Java语言规范17.8节》之后的结论)
分享到:
相关推荐
一个简单的线程同步机制,也能实例了解wait notify的使用,notify与notifyAll的区别
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
当其它持锁线程调用 notify() 或 notifyAll() 方法,会按照一定规则唤醒等待集 合中的等待线程,恢复为可运行状态 有时限等待 当获取锁成功后,但由于条件不满足,调用了 wait(long) 方法,此时从可运 行状态释放锁...
生产者消费者详解wait():执行该方法的线程对象,释放同步锁,JVM会把该线程放到等待池中,等待其他线程唤醒该线程 notify():执行该方法的线程唤醒在等待池中等待的任意一个线程,把线程转到锁池中等待(注意锁池和...
Pg-wait-samplingPg-wait-sampling 是等待事件的抽样统计。介绍PostgreSQL 9.6 提供了有关特定进程当前等待事件的信息。然而,为了收集服务器行为的描述性统计,用户必须多次采样当前等待事件。Pg-wait-sampling 是...
在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,添加名为TcpTimedWaitDelay的DWORD键,设置为十进制0,以缩短TIME_WAIT的等待时间。 Windows下的调整方法为 HKEY_LOCAL_MACHINE/...
java多线程下wait和notify的作用
本程序截止2019/7/29已经有了接近十种功能了:程序当前版本信息显示wait -inf(或-i),程序显示指定版本信息wait -inf(或-i) [版本],等待1秒(1000毫秒)wait,等待指定毫秒数:wait [毫秒数],提示,并等待指定...
获取已开机时间。#include #include #include #include void sleep( long wait ); void gettime(); void main( void ) { int flag=1; char time[128]; _strtime(time); printf( "OS time:%s\n",time); //...
Java多线程的等待唤醒机制代码演示 通过代码,完整的还原消费者和生产者的等待唤醒过程...- void wait() 当前线程等待,直到被其他线程唤醒 - void notify() 随机唤醒单个线程 - void notifyAll() 唤醒所有线程
wait()编程wait()编程wait()编程wait()编程wait()编程
主要介绍了Java wait和notify虚假唤醒,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Shell等待示例[ShellWait.rar]-精品源代码
DOS(CMD)窗口和批处理命令如何实现等待(或睡眠)一定时长?小工具EZwait帮到你!目前版本:3 (仅限Windows操作系统,需安装C++环境)平时有没有对于CMD窗口和批处理如何实现等 待(或休眠)一定时长的问题感到...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
一、使用说明 1.设置主板 BIOS 首先,我们要在主板 BIOS 里面设置 WOL 唤醒功能的开关, ... wait for link 等,因此需要大家自行挖掘了 3.扫描局域网IP及 MAC 把你需要唤醒的机器全部开机- 打
使用这个插件来等待没有预料到的一切。 安装 npm i -D cypress-wait-until # or yarn add -D cypress-wait-until 用法 cypress-wait-until扩展了赛普拉斯的cy命令。 将此行添加到您项目的cypress/support/commands...
at_wait_cmd 等待一个AT指令集或者超时则立刻返回 等待途中会不断调用OS的延迟程序 让系统能有时间去执行其他任务 使用方法例如{ at_send_cmd("AT+UART=%u,%u,%u,%u,%u\r\n",baudrate,databit,stopbit,parity,...
0、概述 多线程间通信,其实是多个线程操操作同...该线程发布对此监视器的所有权并等待,直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对象的监视器上等待的线程醒来。然后该线程将等到重新获得对监
创建一个顾客线程(消费者):告知老板要的包子的种类和数量,调用wait方法,放弃cpu的执行,进入到WAITING状态(无限等待) 创建一个老板线程(生产者):花了5秒做包子,做好包子之后,调用notify方法,唤醒顾客吃包子 注意: ...