1 多线程的两种方式
① 创建一个类,继承Thread,重写run方法,
public class MyThread extends Thread { @Override public void run() { for(int i=0;i <=200;i++){ System.out.println(i+getName()); } } } public class Demo1 { public static void main(String[] args) { MyThread myThread1 = new MyThread(); MyThread myThread2 = new MyThread(); myThread1.start(); myThread2.start(); } }
② 创建一个类,实现Runnable接口,重写run方法,
public class MyThread2 implements Runnable{ @Override public void run() { for(int i = 1;i<=100;i++){ System.out.println(i+Thread.currentThread().getName()); } } } public class Demo2 { public static void main(String[] args) { MyThread2 mt2 = new MyThread2(); Thread th2 = new Thread(mt2); Thread th3 = new Thread(th2); th2.start(); th3.start(); } }
2 线程安全
① 发生线程安全的条件
1 . 是否有共享数据
2 . 是否是多线程
3 . 是否对同一数据进行操作
② 线程锁案例
1 创建自定义线程类,模拟去电影院购买电影票。
public class MyThread3 implements Runnable{ private int ticket = 100; @Override public void run() { // TODO Auto-generated method stub while(true){ if(ticket>0){ try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "正在出售第" + (ticket--) + "张票 "); } } } }
创建相应的测试类
public class Demo3 { public static void main(String[] args) { MyThread3 thread3 = new MyThread3(); Thread t1 = new Thread(thread3, "1号"); Thread t2 = new Thread(thread3, "2号"); Thread t3 = new Thread(thread3, "3号"); t1.start(); t2.start(); t3.start(); } }
2号正在出售第100张票 1号正在出售第99张票 3号正在出售第100张票 1号正在出售第98张票 3号正在出售第98张票 2号正在出售第98张票 3号正在出售第96张票 1号正在出售第97张票 2号正在出售第97张票 3号正在出售第95张票 1号正在出售第95张票 2号正在出售第95张票 1号正在出售第94张票 3号正在出售第94张票 2号正在出售第94张票 2号正在出售第92张票 1号正在出售第93张票 3号正在出售第92张票 2号正在出售第90张票 3号正在出售第91张票 1号正在出售第91张票 2号正在出售第89张票 1号正在出售第87张票 3号正在出售第88张票 2号正在出售第86张票 1号正在出售第86张票 3号正在出售第86张票 1号正在出售第84张票 2号正在出售第85张票 3号正在出售第84张票 3号正在出售第83张票 1号正在出售第83张票 2号正在出售第83张票 1号正在出售第82张票 2号正在出售第81张票 3号正在出售第80张票 3号正在出售第79张票 1号正在出售第78张票 2号正在出售第79张票 3号正在出售第77张票 2号正在出售第76张票 1号正在出售第76张票 3号正在出售第75张票 2号正在出售第75张票 1号正在出售第75张票 3号正在出售第74张票 1号正在出售第72张票 2号正在出售第73张票 2号正在出售第71张票 3号正在出售第70张票 1号正在出售第71张票 3号正在出售第69张票 1号正在出售第69张票 2号正在出售第69张票 2号正在出售第68张票 3号正在出售第67张票 1号正在出售第67张票 2号正在出售第66张票 3号正在出售第66张票 1号正在出售第66张票 3号正在出售第65张票 1号正在出售第65张票 2号正在出售第64张票 1号正在出售第63张票 2号正在出售第61张票 3号正在出售第62张票 1号正在出售第60张票 2号正在出售第58张票 3号正在出售第59张票 3号正在出售第57张票 2号正在出售第56张票 1号正在出售第57张票 3号正在出售第55张票 1号正在出售第54张票 2号正在出售第55张票 2号正在出售第53张票 1号正在出售第51张票 3号正在出售第52张票 2号正在出售第49张票 3号正在出售第50张票 1号正在出售第49张票 3号正在出售第48张票 1号正在出售第47张票 2号正在出售第46张票 3号正在出售第45张票 2号正在出售第43张票 1号正在出售第44张票 3号正在出售第42张票 1号正在出售第40张票 2号正在出售第41张票 3号正在出售第39张票 2号正在出售第38张票 1号正在出售第37张票 3号正在出售第36张票 2号正在出售第35张票 1号正在出售第36张票 2号正在出售第34张票 1号正在出售第32张票 3号正在出售第33张票 3号正在出售第31张票 1号正在出售第29张票 2号正在出售第30张票 2号正在出售第28张票 3号正在出售第27张票 1号正在出售第26张票 3号正在出售第25张票 2号正在出售第23张票 1号正在出售第24张票 2号正在出售第21张票 3号正在出售第20张票 1号正在出售第22张票 3号正在出售第18张票 2号正在出售第18张票 1号正在出售第19张票 3号正在出售第17张票 2号正在出售第16张票 1号正在出售第16张票 3号正在出售第15张票 2号正在出售第15张票 1号正在出售第15张票 1号正在出售第12张票 3号正在出售第14张票 2号正在出售第13张票 3号正在出售第11张票 1号正在出售第10张票 2号正在出售第10张票 3号正在出售第9张票 1号正在出售第9张票 2号正在出售第9张票 1号正在出售第8张票 3号正在出售第8张票 2号正在出售第8张票 1号正在出售第7张票 2号正在出售第7张票 3号正在出售第7张票 3号正在出售第6张票 2号正在出售第6张票 1号正在出售第6张票 3号正在出售第3张票 2号正在出售第5张票 1号正在出售第4张票 3号正在出售第2张票 2号正在出售第2张票 1号正在出售第2张票 2号正在出售第1张票 3号正在出售第1张票 1号正在出售第1张票
通过控制台,我们可以看出打印的有问题,票有很多重复了。就是因为多线程的原因,分析一下原因,当1 号刚进来的时候,执行了--ticket的时候,这个时候,线程2进来了,所以出现了很多都在出卖同一张票的原因,下面说一下解决方案
public class MyThread3 implements Runnable{ private int ticket = 100; private Object object = new Object(); @Override public void run() { // TODO Auto-generated method stub while(true){ synchronized (object) { if(ticket>0){ try { Thread.sleep(200); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "正在出售第" + (ticket--) + "张票 "); } } } } }
我在主要的代码段上添加锁的机制,
synchronized (object)
里面传递的参数是任意的,这个时候,当线程1进入的时候,会给cpu上一把锁,其他的线程不能进入,只有当线程1离开的时候,其他的线程才能进来。运行之后,我们查看控制台
3号正在出售第100张票 3号正在出售第99张票 3号正在出售第98张票 3号正在出售第97张票 3号正在出售第96张票 3号正在出售第95张票 3号正在出售第94张票 2号正在出售第93张票 2号正在出售第92张票 1号正在出售第91张票 2号正在出售第90张票 2号正在出售第89张票 3号正在出售第88张票 2号正在出售第87张票 1号正在出售第86张票 2号正在出售第85张票 2号正在出售第84张票 2号正在出售第83张票 2号正在出售第82张票 2号正在出售第81张票 2号正在出售第80张票 2号正在出售第79张票 2号正在出售第78张票 2号正在出售第77张票 2号正在出售第76张票 2号正在出售第75张票 2号正在出售第74张票 2号正在出售第73张票 2号正在出售第72张票 2号正在出售第71张票 2号正在出售第70张票 2号正在出售第69张票 2号正在出售第68张票 2号正在出售第67张票 3号正在出售第66张票 3号正在出售第65张票 3号正在出售第64张票 3号正在出售第63张票 2号正在出售第62张票 2号正在出售第61张票 1号正在出售第60张票 2号正在出售第59张票 3号正在出售第58张票 3号正在出售第57张票 3号正在出售第56张票 3号正在出售第55张票 3号正在出售第54张票 3号正在出售第53张票 3号正在出售第52张票 3号正在出售第51张票 3号正在出售第50张票 2号正在出售第49张票 1号正在出售第48张票 2号正在出售第47张票 2号正在出售第46张票 2号正在出售第45张票 2号正在出售第44张票 3号正在出售第43张票 2号正在出售第42张票 1号正在出售第41张票 2号正在出售第40张票 2号正在出售第39张票 2号正在出售第38张票 3号正在出售第37张票 2号正在出售第36张票 2号正在出售第35张票 1号正在出售第34张票 2号正在出售第33张票 3号正在出售第32张票 3号正在出售第31张票 3号正在出售第30张票 3号正在出售第29张票 3号正在出售第28张票 3号正在出售第27张票 2号正在出售第26张票 1号正在出售第25张票 1号正在出售第24张票 2号正在出售第23张票 2号正在出售第22张票 2号正在出售第21张票 3号正在出售第20张票 2号正在出售第19张票 2号正在出售第18张票 2号正在出售第17张票 1号正在出售第16张票 1号正在出售第15张票 2号正在出售第14张票 2号正在出售第13张票 2号正在出售第12张票 2号正在出售第11张票 2号正在出售第10张票 2号正在出售第9张票 3号正在出售第8张票 3号正在出售第7张票 2号正在出售第6张票 1号正在出售第5张票 1号正在出售第4张票 2号正在出售第3张票 2号正在出售第2张票 3号正在出售第1张票
相关推荐
刘嘉怡.中期检查.doc
内容概要:本文详细介绍了如何使用COMSOL Multiphysics进行热电效应仿真的全过程。首先解释了热电效应的基本概念及其应用场景,如手机充电发烫、吹风机温度升高等。接着,通过具体实例展示了如何在COMSOL中建立热电模型,包括选择合适的物理场(焦耳热和热电效应)、设定材料属性(电导率、导热系数、塞贝克系数)、绘制几何形状以及设置边界条件。文中还提供了详细的MATLAB代码片段用于自动化建模流程,涵盖求解器配置、网格划分、后处理等方面的技术细节。此外,作者分享了一些常见问题的解决方案,如求解器不收敛、网格畸变等。 适合人群:对热电效应感兴趣的科研人员、工程技术人员及高校学生,尤其适用于有一定COMSOL和MATLAB基础的学习者。 使用场景及目标:帮助读者掌握热电效应的基本原理和COMSOL仿真技能,能够独立完成从模型构建到结果分析的完整流程。目标是提高热电转换系统的效率,优化设计参数,探索新材料的应用潜力。 其他说明:文章不仅提供了理论指导,还包括大量实战经验和技术技巧,有助于解决实际建模过程中遇到的问题。
内容概要:本文深入探讨了汽车内外饰模具设计的关键要素,涵盖分型面设计、斜顶和滑块的应用、模架选择以及顶出系统的配置。针对每个部分,不仅提供了理论指导,还辅以Python、MATLAB等编程语言的实际代码示例,帮助理解和实施具体设计方案。例如,分型面设计强调了如何根据产品结构和外观要求确定最佳分型面位置;斜顶和滑块部分讨论了不同类型及其应用场景;模架和顶出系统则关注于结构稳定性和顶出效果的优化。 适合人群:从事汽车模具设计的专业人士,尤其是希望深入了解内外饰模具设计细节的新手设计师和技术人员。 使用场景及目标:适用于汽车内外饰模具设计项目,旨在提高模具设计的精度和效率,减少试错成本,确保产品质量。通过学习本文提供的技术和实践经验,能够更好地应对实际工作中遇到的各种挑战。 其他说明:文中提到的代码示例和经验公式均来源于实际工程案例,具有较高的参考价值。同时,作者还分享了许多宝贵的行业经验和技巧,有助于读者快速掌握模具设计的核心技能。
python3.10以上 可安装pyside6(类似pyqt),具体安装操作步骤
内容概要:DeepSeek AI是由杭州深度求索人工智能基础技术研究有限公司于2025年1月20日发布的深度探索AI技术。它具有多模态能力、多语言支持、长上下文理解、领域垂直优化、开源特性等多项技术突破,支
IIS配置phpweb服务器所需VC_redist.x64.rar
云南移动5G-A网业战略发展探讨 -创新领航,千帆竞发,共同迈入5G-A新时代.pptx
本文描述了如何使用C#基于OpenCvSharpe实现模版匹配功能,其中实现了下功能: 1、图像加载; 2、模版加载、绘制、保存功能; 3、模版匹配功能。
内容概要:本文档汇集了CSci 235软件设计与分析II课程中关于数据结构的面试题,由Stewart Weiss教授整理。文档涵盖了广泛的数据结构主题,包括但不限于链表(如单链表、双向链表、循环链表)、二叉树(如二叉搜索树、最小高度二叉搜索树)、栈、队列等。每个问题都旨在考察求职者对不同数据结构的理解及其应用场景。例如,选择合适的数据结构实现手机通讯录功能,或设计支持撤销功能的文本编辑器。此外,文档还探讨了复杂度分析(Big-O表示法),以及如何优化特定操作的时间复杂度。最后,文档提供了额外的学习资源链接,帮助求职者进一步准备面试。 适合人群:计算机科学专业的学生或有志于从事软件开发工作的求职者,特别是那些希望在技术面试中表现优异的人士。 使用场景及目标:①理解并掌握常见数据结构的基本概念和特性;②学会根据不同场景选择最合适的数据结构;③掌握常见数据结构操作的时间复杂度分析;④为技术面试做充分准备,提高面试成功率。 其他说明:文档中的问题不仅限于理论知识,还包括实际编码练习,建议读者在学习过程中动手实践,以加深理解和记忆。同时,文档提供的额外资源链接可以作为扩展阅读材料,帮助读者更全面地掌握相关知识。
Matlab领域上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
帆软本地打印插件FinePrint 8.0版本,适用于FineReport8
内容概要:本文介绍了密歇根大学EECS 461课程——嵌入式控制系统的核心内容及其发展背景。课程旨在教授学生嵌入式控制系统的理论与实践,包括传感器和执行器接口、实时性能和安全要求、混合行为系统、分布式控制网络等方面的知识。文中特别强调了现代汽车作为嵌入式控制系统的典型应用,从1977年到2019年间,汽车技术经历了从模拟控制到微处理器控制的巨大变革,如今的汽车具备了更高效、更环保、更安全的特点。课程还涵盖了S32K144微控制器的开发环境、实验室练习(如数字I/O、PWM信号生成、虚拟墙模拟等)以及自动代码生成工具的使用。 适合人群:具备一定编程基础,特别是对嵌入式系统感兴趣的本科生和研究生,尤其是电气工程、计算机科学专业的高年级学生或硕士生。 使用场景及目标:①了解嵌入式控制系统的基本概念和发展历程;②掌握嵌入式控制系统的设计方法和技术手段,如实时操作系统、中断处理、网络通信协议(CAN)等;③通过实际项目操作,熟悉嵌入式硬件平台和开发工具链的应用。 其他说明:随着汽车行业向智能化、自动化方向发展,对于能够开发复杂嵌入式软件的人才需求日益增长。EECS 461不仅为学生提供了扎实的技术训练,也为他们未来的职业发展打下了坚实的基础。此外,课程还反映了跨学科教育的重要性,鼓励学生打破传统学术界限,培养解决实际问题的能力。
内容概要:本文详细介绍了如何利用C#与Halcon联合编程构建高效的视觉几何定位与测量框架。主要内容涵盖模板创建与匹配、圆测量、数据持久化以及图像采集等方面的技术细节。首先,通过创建形状模板并进行匹配,实现了工件的精确定位。接着,针对圆形物体的测量,提出了动态ROI绘制、亚像素边缘提取和稳健圆拟合的方法。此外,还讨论了模板管理和图像采集的最佳实践,确保系统的稳定性和高效性。最后,强调了Halcon对象的内存管理和错误处理机制,提供了实用的优化建议。 适合人群:具备一定编程基础,尤其是对C#和Halcon有一定了解的研发人员和技术爱好者。 使用场景及目标:适用于工业生产线上的自动化检测设备开发,旨在提高工件定位和尺寸测量的精度与效率。主要目标是帮助开发者掌握C#与Halcon联合编程的具体实现方法,从而构建稳定可靠的视觉检测系统。 其他说明:文中提供了大量实战代码片段和调试技巧,有助于读者快速理解和应用相关技术。同时,作者分享了许多实际项目中的经验和教训,使读者能够避开常见陷阱,提升开发效率。
内容概要:本文深入探讨了DeepSeek AI的独特优势及其在全球AI领域的影响力。DeepSeek由中国深度求索公司开发,自2025年1月20日发布以来,凭借其卓越的性能和独特优势迅速吸引了全球关注。其核心优势包括:1) 极致成本效率,如低成本训练和高效推理;2) 强大的推理能力,涵盖多领域表现优异
php连接sqlserver之VC_redist.x64.exe
内容概要:本文详细介绍了利用Matlab/Simulink进行异步电动机交流调速系统的仿真实验,主要探讨了两种控制方式:恒压频比(V/F)开环控制和转差频率闭环控制。文中不仅提供了具体的数学模型和代码片段,还展示了不同控制方式下的仿真结果对比,包括转速响应、电流波形和谐波含量等方面的表现。此外,文章深入讲解了SVPWM(空间矢量脉宽调制)的应用,强调了其相对于传统SPWM的优势,并给出了详细的参数调整技巧和注意事项。 适合人群:从事电机控制系统设计的研究人员和技术人员,尤其是对Matlab/Simulink有一定基础并希望深入了解异步电动机调速系统的人群。 使用场景及目标:适用于需要进行电机控制算法开发和优化的场合,旨在帮助读者掌握异步电动机调速的基本原理和具体实现方法,提高仿真的准确性和效率。 其他说明:文章通过丰富的实例和图表,生动地展示了各种控制策略的特点和效果,有助于读者更好地理解和应用相关理论。同时,文中提供的调试技巧对于解决实际工程中的常见问题非常有帮助。
内容概要:本文详细介绍了如何利用Matlab进行电动汽车等速工况续驶里程的仿真。首先解释了等速工况的概念及其重要性,接着展示了具体的参数设定,如车辆质量、风阻系数、电池容量等。然后深入探讨了核心算法,包括阻力计算、功率需求、能量消耗以及SOC(剩余电量)的变化过程。文中特别强调了一些常见的陷阱和注意事项,如单位换算错误、电机效率的动态变化等。最后,通过可视化工具展示了仿真结果,并讨论了可能的改进方向,如引入NEDC工况循环和其他动态因素。 适合人群:新能源汽车专业的学生、研究人员以及对电动汽车仿真感兴趣的工程师。 使用场景及目标:①帮助理解和掌握电动汽车等速工况续驶里程仿真的原理和方法;②提供详细的代码实现和注释,便于学习和修改;③用于课程设计、毕业设计或其他研究项目。 其他说明:本文不仅提供了完整的Matlab代码,还包括详细的参数说明和常见问题解析,确保使用者能够顺利运行并理解整个仿真过程。同时,作者还分享了许多实践经验,有助于提高仿真的准确性和实用性。
【定稿】桂林电子科技大学第七届大学生思政课社会实践优秀成果展示活动实施方案 (1).zip
内容概要:本文详细介绍了使用Maxwell 16.0和ANSYS 2020进行直线感应电机瞬态磁场仿真的方法和技术要点。首先强调了建模前的准备工作,包括初级线圈布置、次级导体材料选择、气隙宽度等参数的确定。然后针对Maxwell 16.0用户,讲解了坐标系的选择(笛卡尔坐标系)、初级绕组绘制、运动参数设置、网格剖分优化以及边界条件的正确配置。对于ANSYS 2020用户,则着重讲述了如何利用Maxwell模块建立模型并在Mechanical中进行电磁力耦合分析,包括参数化扫描设置、气隙厚度扫描、磁密云图动态更新等技巧。此外,文中还分享了许多实用的经验和注意事项,如避免常见的参数设置错误、提高仿真精度的方法、处理推力波动等问题的具体措施。 适合人群:从事电机设计与仿真的工程师、研究人员,尤其是有一定Maxwell和ANSYS使用基础的技术人员。 使用场景及目标:帮助用户掌握直线感应电机瞬态磁场仿真的全流程,确保仿真结果的准确性,提升工作效率。具体应用场景包括但不限于新电机设计验证、现有电机性能优化、故障诊断等。 其他说明:文中提供了大量具体的命令和脚本示例,便于读者直接应用到实际工作中。同时,作者结合自身丰富的实践经验,给出了许多宝贵的建议和警示,有助于读者避开常见陷阱,顺利完成仿真任务。
内容概要:本文详细介绍了如何在Matlab Simulink中构建交流异步电机的矢量控制模型及其SVPWM调制方法。首先解释了坐标变换(如Clarke和Park变换)的基本原理,并提供了具体的实现代码。接着讨论了双闭环控制策略,即电流环和速度环的设计与参数整定,强调了PI控制器的抗饱和处理以及速度环带宽的选择。对于SVPWM部分,文章对比了几种不同的调制算法,推荐了一种改进的七段式算法,提高了电压利用率并降低了谐波含量。此外,文中还分享了许多实际调试过程中遇到的问题及解决方案,如启动电流冲击、低频振荡等。 适合人群:从事电力电子、电机驱动系统设计的研究人员和技术工程师,尤其是对矢量控制和SVPWM感兴趣的初学者。 使用场景及目标:适用于需要深入了解交流异步电机矢量控制原理及其实现方法的人群。目标是在掌握理论基础上,能够独立搭建并优化Simulink仿真模型,从而提高实际应用中的性能表现。 其他说明:随文提供的工程文件包含了完整的模型和详细的参数整定表格,便于读者进行实践操作。同时,作者还提供了一些实用的小贴士,帮助避免常见的错误和陷阱。