java 等待唤醒机制,Java线程等待唤醒机制
记录面试过程中被问到的几个需要手写代码的小案例
1.请手写出线程的等待唤醒机制
案例中两个线程:SyncSetThread设置学生信息,SyncGetThread用来获取学生信息,在Student实体中提供一个标记属性flag,记录当前是否有数据。
等待唤醒机制
设置信息线程SyncSetThread
/*
* 使用Object的wait() 和 notify() 来实现等待唤醒机制
* Created by JackYang on 2017/10/17.
*/
class SyncSetThread implements Runnable {
private final Student student;
SyncSetThread(Student student) {
this.student = student;
}
@Override
public void run() {
int num = 0;
while (true) {
synchronized (student) {
if (student.flag) {
try {
student.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (num % 2 == 0) {
student.name = "JackYang";
student.age = 26;
} else {
student.name = "江一燕";
student.age = 28;
}
++num;
student.flag = true;
student.notify();
//此时唤醒,SyncSetThread和SyncGetThread两个线程都有同等的机会去抢占资源
}
}
}
}
获取信息线程SyncGetThread
class SyncGetThread implements Runnable {
private final Student student;
SyncGetThread(Student student) {
this.student = student;
}
@Override
public void run() {
while (true) {
synchronized (student) {
if (!student.flag) {
try {
//对象中没有数据的时候就等待
student.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(student.name + "---" + student.age);
//数据消费完了(取出后)改变标记
student.flag = false;
student.notify();
//此时唤醒,SyncSetThread和SyncGetThread两个线程都有同等的机会去抢占资源
}
}
}
}
测试入口
/*
* 线程的等待唤醒机制,实现一人一次有规律
* Created by JackYang on 2017/10/17.
*/
public class TestSyncThread {
public static void main(String[] args) {
Student student = new Student();
SyncSetThread syncSetThread = new SyncSetThread(student);
SyncGetThread syncGetThread = new SyncGetThread(student);
Thread thread1 = new Thread(syncSetThread);
Thread thread2 = new Thread(syncGetThread);
thread1.start();
thread2.start();
}
}
2.请手写出线程死锁代码
这个没得商量,直接上代码
/**
* 死锁代码
* Created by JackYang on 2017/10/17.
*/
class DieThread extends Thread {
private boolean flag;
DieThread(boolean flag) {
this.flag = flag;
}
@Override
public void run() {
if (flag) {
//防止一次卡不住
while (true) {
synchronized (MyLock.lockA) {
System.out.println("true lockA");
synchronized (MyLock.lockB) {
System.out.println("true lockB");
}
}
}
} else {
while (true) {
synchronized (MyLock.lockB) {
System.out.println("false lockB");
synchronized (MyLock.lockA) {
System.out.println("false lockA");
}
}
}
}
}
}
java 等待唤醒机制,Java线程等待唤醒机制相关推荐
- 【小白学java】D36》》》线程入门学习,线程同步机制 和 线程等待与唤醒机制
- java 添加等待时间_Java中线程等待特定时间的最有效方法 - java
我知道这个问题here,但是我有一个稍微不同的问题.如果我希望自己通过各种Thread方法(而不是通过实用程序类或Quartz)手动编码某个线程在特定时间的运行,那么最有效(就开销而言)进行编码. 我 ...
- java队列等待唤醒_Java深入学习29:线程等待和唤醒的两个方案
Java深入学习29:线程等待和唤醒的两个方案 模拟场景 一个门店,有一个店员,有消费者来消费商品(每次消费1件商品),有仓库人员来添加(生产)商品(每次生产1件商品),并假设库存上限是2. 基础代码 ...
- 菜鸟学习笔记:Java提升篇8(线程2——线程的基本信息、线程安全、死锁、生产者消费者模式、任务调度)
菜鸟学习笔记:Java提升篇8(线程2--线程的基本信息.线程安全.死锁.生产者消费者模式.任务调度) 线程的基本信息 线程同步 线程安全 死锁 生产者消费者模式 任务调度(了解) 线程的基本信息 J ...
- python线程的注意点(线程之间执行是无序的、主线程会等待所有的子线程执行结束再结束(守护主线程)、线程之间共享全局变量、线程之间共享全局变量数据出现错误问题(线程等待(join)、互斥锁))
1. 线程的注意点介绍 线程之间执行是无序的 主线程会等待所有的子线程执行结束再结束 线程之间共享全局变量 线程之间共享全局变量数据出现错误问题 2. 线程之间执行是无序的 import thread ...
- java基础提升(二):多线程、线程安全、线程状态、等待唤醒机制、线程池
目录 一. 多线程 1.1并发与并行 1.2 线程与进程 1.3 创建线程类 1.3.1 方式一:继承Thread类 1.3.2 方式二:实现Runnable接口 1.3.3 Thread和Runna ...
- Java线程等待唤醒机制(加深理解)
今天看源码的时候遇到这样一个场景,某线程里面的逻辑需要等待异步处理结果返回后才能继续执行.或者说想要把一个异步的操作封装成一个同步的过程.这里就用到了线程等待唤醒机制,下面具体看一下. 等待唤醒机制示 ...
- Java虚拟机(JVM)与Java内存模型(JMM)学习笔记
Java虚拟机[JVM]与Java内存模型[JMM]学习笔记 Java虚拟机(JVM) 三种JVM JVM 位置 JVM的主要组成部分及其作用 类加载器 双亲委派机制 沙箱安全机制 Java本地接口( ...
- 深入理解JVM之代码执行机制与线程资源同步及交互机制
Java规范定义标准结构如图3.1 Java代码的执行机制 Java源码编译机制 javac将Java源码编译为class文件的步骤如图3.2 1.分析和输入到符号表(Parse and Enter) ...
- java sleep唤醒_Java中的等待唤醒机制—至少50%的工程师还没掌握!
Java中的等待唤醒机制-至少50%的工程师还没掌握! 发布时间:2019-12-14 01:53, 浏览次数:222 , 标签: Java 这是一篇走心的填坑笔记,自学Java的几年总是在不断学习新 ...
最新文章
- 嵌入式linux开发课程设计,嵌入式Linux开发课程设计指导书
- C++输入函数的应用
- javascript学习系列(18):数组中的include方法
- Version Control
- Hadoop 2.2.0 在centos6.2 64位下的安装--分布式模式
- CTreeCtrl 类的InsertItem成员函数
- Nginx主配置文件的优化-nginx主配置文件的优化
- week15-字符串
- Mac 忘记管理员名和密码
- 9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的求职之路
- Win8快捷键收集大汇总
- 总结Criteria的简要使用概述(Hibernate5.2+)
- linux 防火墙 功能点,功能点(Funciton Point FP)估算法(三) 调整因子
- electron 设置窗口默认最大化、全屏
- 原生javascript-图片查看器的制作-注释版
- No matching version found for @soda/friendly-errors-webpack-plugin@1.8.0.
- 腾讯通服务器删除离线消息,如何撤回RTX离线消息离线文件.docx
- flutter 实现切屏横竖屏切换
- SAP GUI 登录语言设置
- 以问题为导向剖析一些矩阵等价类的本质(合同篇)
热门文章
- cockroachdb mysql_CockroachDB学习笔记——[译]CockroachDB中的SQL:映射表中数据到键值存储...
- MySQL 修改数据
- fetch用英语解释_fetch的意思在线翻译,解释fetch中文英文含义,短语词组,音标读音,例句,词源,同义词【澳典网ODict.Net】...
- java中的single_解析java泛型(一)
- idea junit 测试看不到控制台报错信息_高手都这么给 Spring MVC 做单元测试!
- 不同存储结构的文件磁盘io操作次数_MySQL InnoDB存储引擎
- python docker_Docker实践:python应用容器化
- react实现全选和反选_全选的实现
- mysql中教如何拼接字段(列)值、加入运算、设置别名(非常实用)
- DATA SHARING Help JetBrains improve its products by sending anonymous data about features and plugin