java 等待唤醒机制,Java线程等待唤醒机制

记录面试过程中被问到的几个需要手写代码的小案例

1.请手写出线程的等待唤醒机制

案例中两个线程:SyncSetThread设置学生信息,SyncGetThread用来获取学生信息,在Student实体中提供一个标记属性flag,记录当前是否有数据。

8c76f164be77

等待唤醒机制

设置信息线程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");

}

}

}

}

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Xshell实现Windows上传文件到Linux主机

经常有这样的需求,我们在Windows下载的软件包,如何上传到远程Linux主机上?还有如何从Linux主机下载软件包到Windows下;之前我的做法现在看来好笨好繁琐,不过也达到了目的,笨人有本方法嘛; 我是怎…

织梦自适应php源码,DEDE织梦PHP源码响应式建筑设计类网站织梦模板(自适应手机端)...

模板名称:响应式建筑设计类网站织梦模板(自适应移动端) 利于SEO优化模板详情:织梦最新内核开发的模板,该模板属于企业通用、HTML5响应式、建筑设计类企业使用,一款适用性很强的模板,基本可以适合各行业的企业网站&…

mac本用WTG(Windows To Go)安装Win10到移动硬盘

准备工作: 一个空的 USB 3.0 移动硬盘(在安装 WTG 时候会将这个硬盘清空重新并分区,注意备份好数据。USB 3.0 的优盘是不行的,即使安装成功,系统的运行速度会奇慢) 原版Windows 10 安装镜像(建议…

js初步简单的编程代码

简单图片切换编码demo图片地址自行替换 简单图片切换编码<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml" …

安卓文本编辑器php cpp,开源的Android富文本编辑器

RichEditor基于原生EditTextspan实现的Android富文本编辑器github地址&#xff1a;https://github.com/yuruiyin/RichEditor组件描述该组件是基于原生EditTextspan的方式实现的&#xff0c;旨在提供一个功能齐全且使用方便的Android富文本编辑器。主要支持了加粗斜体等行内样式…

python gif 透明,Python3+试点批量处理简单的GIF到PNG并透明地去除背景色,python3Pillow,gif,转成,png,透明化,去掉...

1. 安装Pillow, 只用这个应该也可以&#xff0c;2. 安装 cImage下载后解压&#xff0c;拷贝image.py到你python安装目录的 Lib\site-packages 中。from PIL import Imageimport osimport imagedef get_imlist(path):"""返回目录中所有gif图像的文件名列表图像的…

matlab求半衰期,如何使用GLD和GDX价差来估计均值回归的半衰期

计算均值回归时间序列的半衰期我们可以通过例中GLD和GDX的均值回归差价来计算均值回归半衰期。MATLAB代码可以从epchan. com/book/example? _ 5. m获得。(这个程序的第一部分与example7 2. m.相同。)%在此播入example7_2. m%Insert example7 2. m in the beginning hereprevzb…

框架错误汇总

1.struts标签&#xff0c;在body中输入代码发现值栈不存在&#xff0c; 即<s:debug></s:debug>没有起作用 1 <body>2 3 4 测试url标签<br>5 <s:url value"index.jsp" var"surl"></s:url><br>6 <s:url value&…

初次进入oracle数据库,Oracle数据库的初次使用

oracle数据库的初次使用&#xff1a;oracle自带了用户 system /system管理员用户 scott/tiger用户初次使用&#xff1a;创建表空间(此处为使用默认的用户scott/tiger)在控制台&#xff1a;1.使用system/system用户登录语句&#xff1a;sqlplus system/system2.赋予用户权限&…

oracle+循环插入sql,SQL server,Oracle循环插入百万数据

SQL server&#xff0c;Oracle循环插入百万数据SQL server&#xff0c;Oracle循环插入百万数据压测时常需要往数据库插入大量数据&#xff0c;下面是我往两个数据库插入数据时用的脚本declare maxSum int,lid nvarchar(64), -- lid为表idcid int,userid nvarchar(64),oper_time…

jquery 通过submit()方法 提交表单示例

jquery 通过submit()方法 提交表单示例&#xff1a; 本示例&#xff1a;以用户注册作为例子。使用jquery中的submit()方法实现表单提交。 注&#xff1a;本示例仅提供了对表单的验证&#xff0c;本例只用选用了三个字段作为测试。 用户点击提交按钮时&#xff0c;触发点击事件&…

php background-image,css background-image属性怎么用

css background-image属性为元素设置背景图像&#xff0c;语法为&#xff1a;background-image:url(图片路径)。设置的背景图像会占据元素的全部尺寸&#xff0c;包括内边距和边框&#xff0c;但不包括外边距。css background-image属性怎么用&#xff1f;作用&#xff1a;为元…

webstorm

问题描述&#xff1a;webstorm打开文件夹&#xff0c;文件夹内的文件不能全部显示&#xff0c;如图 原因&#xff1a;配置文件xml出错 解决方法&#xff1a;删除文件夹内的idea文件&#xff0c;再用webstrom重新打开就行╮(╯▽╰)╭转载于:https://www.cnblogs.com/chenluomen…

linux文件句柄数满,linux文件句柄数超出系统限制怎么办?

1、问题阐述&#xff1a;too many open files&#xff1a;顾名思义即打开过多文件数。不过这里的files不单是文件的意思&#xff0c;也包括打开的通讯链接(比如socket)&#xff0c;正在监听的端口等等&#xff0c;所以有时候也可以叫做句柄(handle)&#xff0c;这个错误通常也可…

linux 内核编译不能打字,linux系统升级后,手动编译的kernel无法启动问题

linux系统升级后&#xff0c;手动编译的kernel无法启动问题linux系统升级后&#xff0c;手动编译的kernel无法启动问题做开发相关&#xff0c;需要编译3.18的kernel&#xff0c;x86_64的&#xff0c;但是我的deepin升级v20之后&#xff0c;编译的kernel就无法启动了&#xff0c…

arcgis api 3.x for js 入门开发系列六地图分屏对比(附源码下载)

前言 关于本篇功能实现用到的 api 涉及类看不懂的&#xff0c;请参照 esri 官网的 arcgis api 3.x for js&#xff1a;esri 官网 api&#xff0c;里面详细的介绍 arcgis api 3.x 各个类的介绍&#xff0c;还有就是在线例子&#xff1a;esri 官网在线例子&#xff0c;这个也是学…

SVN版本管理trunk及branch相关merge操作

先说说什么是branch。按照Subversion的说法&#xff0c;一个branch是某个development line&#xff08;通常是主线也即trunk&#xff09;的一个拷贝&#xff0c;见下图&#xff1a; branch存在的意义在于&#xff0c;在不干扰trunk的情况下&#xff0c;和trunk并行开发&#xf…

线程之间通信 等待(wait)和通知(notify)

线程通信概念&#xff1a; 线程是操作系统中独立的个体&#xff0c;但这些个体如果不经过特殊的处理就不能成为一个整体&#xff0c;线程之间的通信就成为整体的必用方式之一。当线程存在通信指挥&#xff0c;系统间的交互性会更强大&#xff0c;在提高CPU利用率的同时还会对线…

女生适合linux运维吗,女生适不适合做Linux运维工程师进入IT行业?

很多人对于女生做Linux运维工程师进入IT还有都存在质疑。因为大多数人认为女生不适合IT行业&#xff0c;IT is a men’sworld&#xff0c;女生学IT是件匪夷所思的事情。在传统的思维当中&#xff0c;女生只适合从事像教师、会计、公务员等稳定的职业。然而&#xff0c;这一莫名…

WPF强制更新

&#xff0c;更新的时候选择最小版本号,就是强制更新 转载于:https://www.cnblogs.com/damsoft/p/6119509.html