一个老问题,一只水杯完成倒水,喝水的动作,保证每次都是先倒水在喝水,
这是一个典型的 生产者-消费者模型,如何解决这样的类型的问题,这就是线程同步下的调度问题
这个模式的难点在于线程间的调度,线程建调度的本质也就是线程状态的转换配合synchronized 同步关键字的使用
不同的代码上的使用同一个同步锁达到不同模块之间的协调
生产线程 执行搜先拿到锁,判断水杯是否有水,没有就生产以后发出信号水杯已有水唤醒消费线程去消费,有的话就阻塞,等待消费以后继续生产
消费线程 与生产线程相反
锁同步和阻塞概念:
1 同步的前提要首先拿到锁 只要是Object的派生类都可以作为锁,保证锁的唯一性也是同步的关键。
2 然后就是阻塞问题,wait 是锁的方法,wait导致线程阻塞的时候会释放锁,但是必须在synchronized 内部使用,wait 和
notify 是对应的 同一个锁的notify就可以唤醒一个通过锁wait 导致线程阻塞,如果同一个锁的wait导致了
多个线程的阻塞 notify的时候就会随即唤醒一个阻塞的线程 而
sleep 是Thread的方法,sleep导致线程阻塞的时候不会释放锁,当这个锁在其他同步方法就不能运行,因为sleep不释放锁,所以其他的代码快就无法同步方法,应为锁是同步的前提,sleep 是通过设置时间解除阻塞
这里
水杯的代码package produce_costomer;
public class Cuper {
public static boolean isEmpty = true;
public static Object lock = new Object();
public void produce() throws InterruptedException {
synchronized (lock) {
//每次执行生产的时候首先判断杯子是否有水,如果没有水就执行倒水动作,然后唤醒这个线程阻塞的消费动作,
//如果有水就阻塞等待消费完以后唤醒继续生产
if (isEmpty) {
System.out.println("生产一杯水.....等待消费");
isEmpty = false;
lock.notify();
} else {
System.out.println("等待消费阻塞中...");
lock.wait();
isEmpty = false;
lock.notify();
}
}
}
public void costomer() throws InterruptedException {
synchronized (lock) {
if (!isEmpty) {
System.out.println("消费一杯水.....等待生产");
lock.notify();
isEmpty = true;
} else {
System.out.println("等待生产阻塞中...");
lock.wait();
lock.notify();
isEmpty = true;
}
}
}
}
生产线程package produce_costomer;
public class ProduceThread extends Thread {
private Cuper cup;
public Cuper getCup() {
return cup;
}
public void setCup(Cuper cup) {
this.cup = cup;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
for (int i = 0; i < 5; i++) {
System.out.println("p" + i);
cup.produce();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
消费线程package produce_costomer;
public class CustomerThread extends Thread {
private Cuper cup;
public Cuper getCup() {
return cup;
}
public void setCup(Cuper cup) {
this.cup = cup;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
for (int i = 0; i < 5; i++) {
System.out.println("c" + i);
cup.costomer();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
测试 package produce_costomer;
/**
* @author ty93
*
*/
public class client {
public static void main(String[] args) {
Cuper cup = new Cuper();
CustomerThread ct = new CustomerThread();
ct.setCup(cup);
ProduceThread pt = new ProduceThread();
pt.setCup(cup);
pt.start();
ct.start();
}
}
分享到:
相关推荐
内容概要:本文详细介绍了如何通过四种注意力机制(SENet、CBAM、ECA、SK)改进YOLOv8算法,应用于PCB缺陷检测。文中首先介绍了一万多张PCB缺陷数据集的准备情况,涵盖多种常见缺陷类型并进行了精细标注。接着分别阐述了四种注意力机制的工作原理及其在YOLOv8中的具体实现方法。随后描述了从数据预处理、模型构建到训练参数设置以及训练过程的具体步骤。最终,模型实现了超过99%的高精度检测效果,显著提升了PCB缺陷检测的准确性。 适合人群:从事电子制造领域尤其是PCB缺陷检测的研究人员和技术开发者。 使用场景及目标:适用于需要提高PCB缺陷检测精度的实际生产和科研项目,旨在通过引入先进的深度学习算法和注意力机制,达到更高的检测效率和可靠性。 其他说明:文中不仅提供了详细的理论解释,还附带了部分关键代码片段,便于读者理解和复现实验。此外,强调了数据质量和模型调优对于获得良好性能的重要性。
内容概要:本文档《滴滴前端研发招聘综合类面试题.pdf》涵盖了前端开发领域内的广泛知识点,旨在帮助求职者应对知名企业的面试挑战。文档内容涉及CSS、JavaScript、浏览器网络、Vue.js、React.js等多个方面的基础知识和技术细节。其中包括但不限于:CSS的各种布局技巧、盒模型、浏览器兼容性处理;JavaScript的基础语法、面向对象编程、异步编程、DOM操作;浏览器的工作原理、HTTP协议、缓存机制;Vue.js和React.js的核心概念、生命周期、组件通信等。此外,还包括移动端开发注意事项、性能优化策略、SEO优化等方面的内容。 适合人群:具备一定前端开发经验,特别是正在准备前端岗位面试的研发人员。 使用场景及目标:①帮助求职者系统复习前端开发所需的核心技能;②加深对前端框架(如Vue.js、React.js)的理解;③熟悉浏览器的工作机制和网络请求的处理;④掌握移动端开发的最佳实践和性能优化技巧。 其他说明:文档内容详实,覆盖面广,不仅有助于面试准备,还能作为日常工作中查漏补缺的学习资料。文中提及的具体技术和知识点,对于提升前端开发者的综合素质有着重要的指导意义。
cmd-bat-批处理-脚本-mshta-countdown.zip
内容概要:本文介绍了永磁同步电机模型预测电流控制(MPCC)的基本原理及其应用。首先概述了永磁同步电机的特点和优势,接着详细解释了MPCC作为一种先进的控制技术,如何通过构建预测模型并利用代价函数寻优策略,从八个电压矢量中选择最优电压矢量,以实现对电机电流的精准控制。文中还提供了简单的代码示例,展示如何在实际控制系统中实现MPCC的关键步骤,包括构建预测模型、定义代价函数、执行寻优策略以及控制逆变器。最后指出,MPCC凭借其优越的控制效果,正在成为电机控制领域的研究热点。 适合人群:从事电机控制及相关领域的研究人员和技术人员,尤其是对永磁同步电机和模型预测控制感兴趣的读者。 使用场景及目标:适用于需要深入了解永磁同步电机控制技术和希望掌握模型预测电流控制(MPCC)实现方法的专业人士。目标是帮助读者理解MPCC的工作机制,并能够在实际项目中应用这一先进技术。 其他说明:本文不仅理论性强,而且附有简单易懂的代码示例,有助于读者更好地理解和实践MPCC的具体操作流程。
基于 Python-Django 框架实现的简单图片上传.zip
内容概要:本文详细介绍了基于Automatica顶刊的研究成果,探讨了移动机器人编队控制中独轮车的分布式非线性与鲁棒控制策略。文章首先展示了核心控制律的设计,包括非线性耦合项、邻居状态观测以及鲁棒项的处理方式。接着讨论了领航者轨迹生成对编队稳定性的影响,并提出了曲率补偿方法来减少轨迹跟踪误差。此外,还提到了在不同环境条件下进行的实际测试及其改进措施,如将sign函数改为饱和函数tanh(5x),解决了高频抖振问题。最后分享了调参秘诀,利用粒子群优化算法整定控制参数,确保系统在复杂环境下长时间稳定运行。 适合人群:从事移动机器人研究的专业人士、自动化控制领域的研究人员和技术爱好者。 使用场景及目标:适用于需要深入了解移动机器人编队控制机制的研究人员,特别是关注分布式非线性和鲁棒控制的应用场景。目标是帮助读者掌握最新的控制算法并应用于实际项目中。 其他说明:文中提供了具体的代码实现和实验数据,有助于读者更好地理解和应用相关技术。同时强调了从理论到实践过程中需要注意的问题,如执行器特性的考虑和控制参数的优化。
内容概要:本文探讨了无刷直流电机在没有霍尔传感器情况下的Simulink建模方法及其性能优化。首先介绍了反电势观测器的设计,利用电压电流的微分关系来估计反电势,这是确定转子位置的关键步骤。接着讨论了锁相环用于捕捉反电势波形过零点的方法,以及低通滤波器对电磁噪声的抑制作用。此外,文中还详细解释了转速估算的技术细节,并分享了一些实际仿真的经验和技巧,如选择合适的求解器和调整参数以获得稳定可靠的仿真结果。 适合人群:从事电机控制系统设计的研究人员和技术工程师,尤其是那些希望深入了解无霍尔传感器条件下无刷直流电机控制机制的人士。 使用场景及目标:适用于需要构建高效、精确的无刷直流电机控制系统的情况,特别是对于减少硬件成本(如去除霍尔传感器)同时保持高性能有需求的应用场合。 其他说明:文章不仅提供了理论指导,还包括了许多实用的操作提示,帮助读者更好地理解和应用所介绍的技术。
reqable-magisk.zip
内容概要:本文探讨了离网风电耦合PEM电解水制氢系统的构建与应用,重点介绍了非并网风电制氢技术及其关键组件PEM电解槽的工作原理和优化方法。文中详细描述了通过Python模拟风力发电功率曲线和平滑处理的方法,以及MATLAB实现的储氢罐压力模糊控制策略。实验数据显示,该系统能够有效应对风电波动,保持稳定的制氢效率,并显著延长设备使用寿命。此外,文章还提出了几种改进模型的方向,如采用不同的PEM效率模型、引入温度耦合效应等。 适合人群:对新能源技术和氢能存储感兴趣的科研人员、工程师和技术爱好者。 使用场景及目标:适用于希望深入了解离网风电制氢系统的设计、优化和实际应用的研究人员;旨在提高系统稳定性和经济效益的目标。 其他说明:文中提供了具体的代码示例和实验数据支持,便于读者理解和复现研究成果。同时,给出了进一步研究的建议和参考文献。
内容概要:本文详细介绍了混合动力系统的Simulink建模方法,涵盖了串联式、并联式和混联式三种结构的控制策略模型。针对每种结构,分别探讨了不同的控制策略,如基于逻辑门限值的状态机控制(RB)、等效燃油消耗最小化(ECMS)、动态规划(DP)、极小值原理(PMP)以及非线性模型预测控制(NMPC)。文中还展示了各种仿真的图像结果,包括发动机和电机的转矩变化、工作模式切换、挡位变化、电池SOC变化、等效百公里燃油消耗量和速度跟随情况。此外,文章提到了模型的价格范围,并建议使用开源模型进行初步研究。 适合人群:从事汽车工程、特别是混合动力车辆研究的专业人士和技术爱好者。 使用场景及目标:帮助研究人员理解和应用Simulink在混合动力系统建模中的具体实现,评估不同控制策略的效果,选择合适的控制策略以提高燃油经济性和系统性能。 其他说明:文中强调了纵向动力学模型的重要性,并提醒读者注意轮胎滑移率模型的应用。同时指出,不同控制策略各有优劣,在实际应用中需综合考虑。
内容概要:本文深入探讨了非支配排序多目标小龙虾优化算法(Multi-Objective Dragonfish Optimization Algorithm based on Non-dominated Sorting)在柔性作业车间调度问题(FJSP)中的应用。文章首先介绍了FJSP的重要性和复杂性,随后详细解释了非支配排序多目标小龙虾优化算法的理论基础,即通过模拟小龙虾觅食行为来进行多目标优化。接着,文章逐步讲解了算法的具体实现步骤,包括问题编码、非支配排序、适应度评估和解的更新。最后,通过MATLAB代码示例展示了算法的实际操作过程及其效果。 适合人群:对多目标优化算法感兴趣的科研人员、工程技术人员以及相关领域的研究生。 使用场景及目标:适用于需要解决复杂调度问题的研究和工业应用场景,旨在帮助读者理解和掌握非支配排序多目标小龙虾优化算法的原理和实现方法,从而应用于实际问题的求解。 其他说明:本文不仅提供了详细的理论背景,还附带了完整的MATLAB代码示例,便于读者动手实践并验证算法的有效性。
《七周七数据库:现代数据库和NoSQL运动指南》 ((美)EricRedmond, (美)Eric Redmond etc.)源代码 《Seven Databases in Seven Weeks, Second Edition A Guide to Modern Databases and the NoSQL Movement》
cmd-bat-批处理-脚本-jscript-getInnerText.zip
内容概要:本文详细介绍了如何利用Abaqus中的dload和vdload子程序进行四轴及多轴汽车的动态荷载模拟。首先概述了Abaqus的功能及其重要性,接着具体讲解了dload子程序如何定义四轴汽车的移动荷载,包括荷载的恒定值、时间函数及表格定义的时间-荷载数据。随后讨论了多轴汽车荷载的复杂性及其模拟方法,强调了不同轴之间的间距和承载能力等因素。最后介绍了vdload子程序的应用,特别是在垂直方向上的荷载定义。文中还提供了一个简单的Fortran代码片段,展示了如何在dload子程序中定义四轴汽车的荷载。 适合人群:从事车辆工程、机械工程及相关领域的研究人员和技术人员,尤其是那些需要进行汽车荷载模拟的专业人士。 使用场景及目标:适用于需要精确模拟汽车行驶过程中对地面压力变化的研究项目,旨在提高汽车设计的科学性和合理性,优化车辆性能。 其他说明:文章不仅提供了理论指导,还附有具体的代码示例,便于读者理解和实践。同时,鼓励读者根据实际情况调整代码,以适应不同的应用场景。
内容概要:本文详细探讨了基于非线性模型预测控制(NMPC)的四旋翼路径跟踪技术。首先,利用现有四旋翼运动学与动力学模型,建立了多输入多输出(MIMO)状态空间模型,涵盖非线性与线性两种模型。接着,引入了约束模型预测控制(MPC),设计了线性和非线性MPC控制器。最后,通过MATLAB仿真实验验证了控制策略的有效性,展示了轨迹跟踪的效果,并分析了如何最小化跟踪误差,确保四旋翼的稳定性和准确性。 适合人群:对无人机控制技术和非线性模型预测控制感兴趣的科研人员、工程师及高校学生。 使用场景及目标:适用于需要深入了解四旋翼飞行器路径跟踪控制机制的研究项目,旨在提高四旋翼飞行器在复杂环境下的自主导航能力。 其他说明:文章不仅提供了详细的理论推导和技术实现步骤,还附有MATLAB仿真代码,帮助读者更好地理解和实践相关概念。
内容概要:本文介绍了基于黑翅鸢算法(BKA)优化的卷积神经网络(CNN)、双向长短期记忆神经网络(BiLSTM)和注意力机制(Attention)相结合的多变量时序预测模型。该模型已在SCI权威期刊《Artificial Intelligence Review》上发表。文中详细描述了模型的构建过程,包括各组件的作用和优化方法,并提供了可直接运行的Matlab代码。代码支持多种评价指标(如R2、MAE、MSE、RMSE等),并附有详细的中文注释,适合初学者使用。此外,还讨论了模型的应用场景和扩展可能性,如更换不同的优化算法或其他类型的神经网络。 适合人群:具备基本编程基础的研究人员和学生,尤其是对时序数据分析感兴趣的初学者。 使用场景及目标:① 处理具有时间依赖性的多变量时序数据;② 使用Matlab进行快速实验和验证;③ 学习和理解深度学习模型的构建和优化方法。 其他说明:该模型不仅可用于预测任务,还可以通过简单修改应用于分类和回归任务。代码提供完整的测试数据集,用户只需替换自己的数据集即可运行。
cmd-bat-批处理-脚本-bigvim64.zip
cmd脚本-bat批处理-12.call-goto.zip
内容概要:本文介绍了2024年最新的基于牛顿-拉夫逊优化算法(NRBO)优化最小二乘向量机(LSSVM)的交叉验证技术。该算法适用于数据分类预测,支持二分类、多分类以及单变量和多变量时序预测。文章详细讲解了算法的工作原理、MATLAB代码实现步骤、环境配置要求,并提供了详细的代码注释和结果可视化方法。此外,还展示了如何通过五折交叉验证抑制过拟合并优化模型参数。最后,鼓励读者尝试其他优化算法并与NRBO-LSSVM进行比较。 适合人群:初学者和有一定MATLAB基础的研发人员,特别是对机器学习和数据分类感兴趣的读者。 使用场景及目标:① 使用MATLAB实现数据分类预测;② 学习如何通过NRBO优化LSSVM模型参数;③ 掌握五折交叉验证技术以提高模型泛化能力;④ 尝试不同优化算法并进行效果对比。 其他说明:本文提供的MATLAB代码经过充分调试,可以直接运行,只需替换数据集即可。代码中包含了分类效果图、迭代优化图和混淆矩阵图的绘制方法,方便用户直观地评估模型性能。
内容概要:本文详细介绍了光伏系统中最大功率点跟踪(MPPT)技术的一种改进方法——变步长电导增量法及其三段式寻优控制模型。文中首先解释了传统电导增量法存在的局限性,如固定步长导致的稳态振荡和响应速度慢等问题。接着重点阐述了新方法的核心算法,即通过动态调整步长来提高跟踪精度和响应速度。具体分为三个阶段:粗扫阶段、精调阶段和稳态维持阶段。文中还提供了具体的Matlab实现代码,并比较了不同版本Matlab(22a和18b)之间的性能差异。实验结果显示,在光照突变情况下,改进后的算法能够显著减少稳态误差并加快响应速度,从而提高光伏发电效率。 适合人群:从事光伏系统研究和技术开发的专业人士,尤其是对MPPT算法感兴趣的科研人员和工程师。 使用场景及目标:适用于希望深入了解和优化光伏系统MPPT算法的研究人员。目标是掌握一种高效的MPPT算法实现方式,能够在实际应用中提高光伏系统的发电效率。 其他说明:文中提供的Matlab代码和设计报告可以帮助读者快速上手实践,同时注意不同Matlab版本间的语法差异。