线程wait和notify方法的demo详解
wait和notify都是针对某个线程而言的:
package com.roocon.thread.t1;
public class NewThread implements Runnable { @Override
public void run() {
while(true){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("自定义线程运行了");
}
} public static void main(String[] args) {
NewThread n = new NewThread();
Thread thread = new Thread(n);//创建线程并且指定线程任务
thread.start();//启动线程
while(true){
System.out.println("主线程运行了");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
n.notifyAll();
}
}
}
运行,发现报错如下:

原因:调用wait和notify以及notifyAll,它其实是要跟一个同步监视器的。而且同步监视器所指定的对象必须是当前类的实例。修改代码如下:
package com.roocon.thread.t1;
public class NewThread implements Runnable { @Override
public synchronized void run() {
while(true){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("自定义线程运行了");
}
} public static void main(String[] args) {
NewThread n = new NewThread();
Thread thread = new Thread(n);//创建线程并且指定线程任务
thread.start();//启动线程
while(true){
synchronized (n){
System.out.println("主线程运行了");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
n.notifyAll();
}
}
}
}
运行结果如下:

总结:
首先,自定义线程执行代码还是主线程执行代码,这个是看哪个线程先获取CPU。
当自定义线程执行代码时,发现有wait方法,则进入等待状态,于是主线程开始执行,执行完后遇到notifyAll,则会去通知阻塞状态的n,此时n会被幻想,于是,线程n开始执行它的代码,输出,自定义线程执行了。自定义线程执行完后又开始等待了。...一直这样循环下去。
线程wait和notify方法的demo详解的更多相关文章
- 线程sleep方法的demo详解
sleep:超时等待指定时间,时间到了之后,重新回到就绪状态,抢到CPU资源后,立马进入运行状态: package com.roocon.thread.t1; public class NewThre ...
- Spring AOP四种实现方式Demo详解与相关知识探究
一.前言 在网络上看到一篇博客Spring实现AOP的4种方式,博主写的很通俗易懂,但排版实在抓狂,对于我这么一个对排版.代码格式有强迫症的人来说,实在是不能忍受~~~~(>_<)~~~~ ...
- react基本demo详解
一.react的优势 1.React速度很快:它并不直接对DOM进行操作,引入了一个叫做虚拟DOM的概念,安插在javascript逻辑和实际的DOM之间,性能好. 2.跨浏览器兼容:虚拟DOM帮助我 ...
- .NET Excel导出方法及其常见问题详解
摘要:.NET Excel导出方法及其常见问题详解. 一.Excel导出的实现方法 在.net 程序开发中,对于Excel文件的导出我们一共有三种导出方式: 利用文件输出流进行读写操作 这种方式的导出 ...
- cloudemanager安装时出现failed to receive heartbeat from agent问题解决方法(图文详解)
不多说,直接上干货! 安装cdh5到最后报如下错误: 安装失败,无法接受agent发出的检测信号. 确保主机名称正确 确保端口7182可在cloudera manager server上访问(检查防火 ...
- cloudemanager安装时出现8475 MainThread agent ERROR Heartbeating to 192.168.30.1:7182 failed问题解决方法(图文详解)
不多说,直接上干货! 问题详情 解决这个问题简单的,是因为有进程占用了.比如 # ps aux | grep super root ? Ss : : /opt/cm-/lib64/cmf/agen ...
- C#类、对象、方法和属性详解
C#类.对象.方法和属性详解 一.相关概念: 1.对象:现实世界中的实体(世间万物皆对象) 2.类:具有相似属性和方法的对象的集合 3.面向对象程序设计的特点:封装 继承 多态 4.对象的三要素:属性 ...
- java集合的方法及使用详解
一.java集合的分类及相互之间的关系 Collection接口:向下提供了List和Set两个子接口 |------List接口:存储有序的,存储元素可以重复 |------ArrayList(主要 ...
- $.ajax()方法所有参数详解;$.get(),$.post(),$.getJSON(),$.ajax()详解
[一]$.ajax()所有参数详解 url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注 ...
随机推荐
- Tomcat安装及环境配置
欢迎任何形式的转载,但请务必注明出处. 本章内容 安装 环境变量入口 三个系统变量配置 测试安装配置是否成功 安装之前请安装jdk并进行环境配置(点击进入jdk教程) 一.安装 点击进入官网下载 二. ...
- Java 之 Properties类 属性集
一.概述 java.util.Properties集合 extends Hashtable<k,v> implements Map<k,v> java.util.Propert ...
- Java软件编码习惯
1.再删除某个类时候,一定别忘记把对应的import也删除掉: 可以手动删除,也可以 Ctrl+Shift+O快捷键自动删除和导入.
- TLS1.3 握手过程特性的整理
1.密码协商 TLS协议中,密码协商的过程中Client在ClientHello中提供四种option 第一:client 支持的加密套件列表,密码套件里面中能出现Client支持的AEAD算法或者H ...
- csdr Makefile for openwrt(纯粹笔记,暂未成功)
1.自已学着写的Makefile给csdr在openwrt平台上使用 参照:https://blog.csdn.net/lvshaorong/article/details/54668220 incl ...
- CentOS7 安装记录
起因是想自建一个本地笔记云存储,按照网上的教程搭建,卡在了其中的一个步骤上(文章见https://www.laobuluo.com/1542.html),卡在了如下图的位置,google了一番解决的办 ...
- mybatis3.1-[topic-16-17]-映射文件_增删改查_insert_获取自增主键的值
笔记要点出错分析与总结 /**测试第16章的增,删,改 的内容 * 错误1: <insert id="addEmp" parameterType="com.bean ...
- No qualifying bean of type 'org.springframework.scheduling.TaskScheduler' available
2019-07-22 17:59:30,966 [DEBUG] [localhost-startStop-1] [ScheduledAnnotationBeanPostProcessor.java : ...
- 在 windows 上安装 git 2.15
下载 by win 下载地址:https://git-scm.com/download/win 如下图.选择对应的版本下载: 安装 by win 1.双击下载好的git安装包.弹出提示框.如下图: 2 ...
- prometheus监控redis,redis-cluster
Prometheus监控redis使用的是redis_exporter, 作者GitHub: https://github.com/oliver006/redis_exporter 需要说明的是: r ...