第8章 人尽其才物尽其用-多线程_第1页
第8章 人尽其才物尽其用-多线程_第2页
第8章 人尽其才物尽其用-多线程_第3页
第8章 人尽其才物尽其用-多线程_第4页
第8章 人尽其才物尽其用-多线程_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2025/3/10零基础快乐学Java新的问题模拟“龟兔赛跑”的过程。“龟兔赛跑”是一个耳熟能详的童话故事,故事中讲述了一只坚持不懈的乌龟和一只骄傲自满的兔子赛跑的过程。兔子觉得乌龟完全没有胜算,所以决定在树下睡一觉再起来比,没想到一觉醒来却发现已经晚了,最终乌龟赢得了胜利。1举一反三第8章人尽其才,物尽其用——多线程龟兔赛跑2银行取款银行取款模拟多线程的同步多线程的等待唤醒机制银行取款3举一反三妈妈的爱十字路口的智能让行体育场的角逐龟兔赛跑传统的龟兔赛跑真实的赛场角逐多线程及其生命周期按照由简到繁的原则,在项目完成的过程中可以先选择文字或是简单图形来代替兔子和乌龟,待赛跑的整个过程模拟完成之后再完善兔子和乌龟的形象,用可以爬行的乌龟和可以奔跑的兔子来使得整个模拟过程更加美观、逼真。与以往的动画过程不同的是,这里的两只小动物需要分别来控制它们的运动速度。一、龟兔赛跑1、传统的龟兔赛跑2、真实的赛场角逐问题:

假如小乌龟的坚持不懈和成功逆袭感动了森林里的其它小动物们,以至于大家都来报名参赛,众多参赛队员各自的运动状态仍使用if条件语句来控制是否合适呢?另外,在“龟兔赛跑”的模拟过程中,比赛的结果是确定的,是人为控制的,而真正的赛场角逐具有公平性,比赛结果是不确定的,那么,这个比赛过程又如何模拟呢?一、龟兔赛跑将线程代码融入龟兔赛跑程序新建:Threadrabbit=newThread(m,"兔子");可运行:rabbit.start();运行:publicvoidrun(){}阻塞:Thread.sleep(20);死亡:线程运行结束。线程和进程多线程的生命周期【例8-1】多线程的生命周期——小球下落3、多线程及其生命周期一、龟兔赛跑多线程的调度【例8-2】线程的优先级【例8-3】未使用join()方法的实例【例8-4】使用join()方法后的实例进程是一个独立运行的程序,如一个正在运行的记事本或浏览器。启动两次记事本则对应两个进程,不同的进程有独立的内存空间。线程是进程中可独立执行的子任务,一个进程可以包含一个或多个线程,但一个线程只能属于一个进程。如做饭是一个进程,摘、洗、切、腌、煎、炒、炖、煮等不同的环节就是多个线程。线程是比进程更小的执行单元,进程是不同的程序,而线程是同一程序中能够共同运行的不同代码段。1-进程与线程01单线程多线程排队等候“同时”执行启动了一个JVM进程,JVM找到入口点main()主线程。JAVA本身是多线程的,如“守护线程”垃圾回收。多个线程共享进程的内存块,线程间的通信容易,速度快(不同的进程因为处于不同的内存块,通信相对困难)。主线程运行完成,JVM进程也随即退出所有线程结束后JVM进程才退出2-线程及其执行方式01最大限度的利用CPU资源让程序获得更高的性能多CPU并行单CPU轮转并发1-多线程的生命周期021、新建状态(New):新创建了一个线程对象。2、就绪状态(Runnable):调用start()方法,线程位于可运行线程池中,等待获取CPU的使用权。3、运行状态(Running):就绪状态的线程获取了CPU,执行run()程序代码。4、阻塞状态(Blocked):线程因为某种原因放弃CPU使用权,暂时停止运行。阻塞的情况分等待阻塞(wait()方法,线程进入等待池)、同步阻塞(同步锁)、其他阻塞(如:sleep()发出了I/O请求)。5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。1-多线程的生命周期022-多线程的实现02实现接口继承类必须实现run()可以不重写run()不考虑类继承关系必须考虑类继承关系两种实现方式的比较:实现方式:

实现Runnable接口或继承Thread类。RunnableDemo&ThreadDemo问:线程两种实现方式哪个更实用?问:创建线程对象,报start未定义错误。//start未定义错误classNoStart{ publicstaticvoidmain(Stringargs[]){ Tt=newT(); t.start(); }}classTimplementsRunnable{ publicvoidrun(){

}}本质区别:一个进程中多个线程的协同工作,多个线程各自独立工作。如:ThreadAndRunnable.java2-多线程的实现02在Java程序中,JVM负责线程的调度,目的是为多个线程分配CPU的使用权。调度的模式有两种:分时调度和抢占式调度。

分时调度:轮流获取CPU使用权,平均分配占用CPU的时间;

抢占式调度:根据线程的优先级别来获取CPU的使用权。JVM的线程调度模式采用了抢占式调度模式。1-线程的调度03Thread分别用setPriority(intnewPriority)和getPriority()

来设置和获取线程的优先级。

Java线程的优先级取值范围是1~10,也可由Thread类的三个静态常量来调整:

staticintMAX_PRIORITY//最高为10。staticintMIN_PRIORITY//最低为1。staticintNORM_PRIORITY//默认为5。

主线程的默认优先级为Thread.NORM_PRIORITY。线程的优先级有继承关系。

相同优先级遵循“先进先出”的原则。2-线程的优先级03线程睡眠:Thread.sleep(longmillis)方法,时间结束转为Runnable状态。线程让步:Thread.yield()方法,暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程。线程加入:join()方法,在当前线程中调用另一个线程的join()方法,则当前线程转入阻塞状态。join(long)方法为调用线程在long时间后加入序列。线程中断:interrupt()方法,只是给线程设置一个中断状态,线程仍会继续执行。booleaninterrupted()用于测试当前线程是否已经中断,线程中断状态由该方法清除。3-其它调度方法032龟兔赛跑举一反三1银行取款3银行取款银行取款模拟多线程的同步多线程的等待唤醒机制举一反三妈妈的爱十字路口的智能让行体育场的角逐龟兔赛跑传统的龟兔赛跑真实的赛场角逐多线程及其生命周期第8章人尽其才,物尽其用——多线程一件事情没有对错之分、好坏之别,它就是很客观的一件事,就像兔子的停停走走,很多人把它作为反面教材,从中感悟到了“人生的真谛在于坚持不懈”,不能一曝十寒,但也有的通过兔子的停停走走想到了爱与礼让,实现了“有爱的妈妈”、“十字路口的智能让行”、“礼让斑马线”、“文明乘车”等等。同样的事情,不同的人感悟不同,这也正是多彩世界的奇妙之处,“万物并育而不相害,道并行而不相悖”,千姿百态,包罗万象。下面分享一些创意作品的思路和关键代码,诚邀您一起来参与,真正“沉浸式”地体味其中的快乐。二、举一反三1、妈妈的爱二、举一反三

天上下着雨,毛毛虫妈妈带着宝宝正急匆匆地往家赶。为了不让宝宝淋雨,妈妈努力撑着一片大大的叶子,尽管自己的半个身子还在“伞”外,但她全然不顾,尽力遮挡着宝宝。宝宝奋力地向前爬着,但它太小了,总是赶不上妈妈。妈妈就爬一会儿停下来等等它,保证宝宝始终在妈妈的保护伞下。虫妈妈的停停走走饱含着浓浓的爱意,有时候驻足是为了更好地并肩同行。

设计思路:毛毛虫的身体由三个椭圆组合而成,通过中间椭圆的上下移动来达到身体起伏的效果,配合整个身体的向前移动即可以模拟毛毛虫的蠕动过程。1、妈妈的爱二、举一反三妈妈的爬行,用flag标志身体的上下蠕动,宝宝的爬行也类似。if(x5<60)flag=false;elseflag=true;if(flag==true){ x1+=m;//向前移动 x2+=n; x5-=t;//身体起伏}else{ x3+=m; x2+=n; x5+=t;}//妈妈等待宝宝的控制 if(x6-x1<10){ f=false; } if(x6-x1>100){ f=true; } if(f==true){ m=12; n=6; t=8; }else{//妈妈停下来等待 m=0; n=0; t=0; }2、十字路口的智能让行二、举一反三

运用多线程技术模拟了东西南北四个方向的车流,并在无信号灯控制的十字路口自动让行,避免发生碰撞,有效地保证了交通安全及路面畅通。

设计思路:运用龟兔赛跑原理,将同向赛跑的两个小动物更改为一个横向运动,一个纵向运动,并把兔子睡觉的过程演变成车辆在十字路口的停车避让过程,这样就具备了智能交通的雏形,剩余的工作无非就是把单行道改为双向车道,多加几个if条件来判断十字路口的避让情况,同时加一些道路标识美化整个页面就可以了。十字路口的智能让行关键思路和代码二、举一反三思路一:利用纵横两个方向的交替控制达到十字路口车辆的避让效果。利用纵向小车的位置来作为激活横向小车行驶的条件,两个方向的交替控制即可达到十字路口车辆的避让效果。这种方法实现难度并不大,仅利用if语句即可完成,但缺点是代码比较繁琐,对小车的控制不够完善,要模拟车流的川流不息比较困难。十字路口的智能让行关键思路和代码二、举一反三思路二:不以路口作为研究对象,运用综合逻辑判断完成车辆避让。if((a<730&&c>1080)||(a<730&&c<730)||(a>1080&&c>1080)){ n=(int)(Math.random()*5+1);//车辆行驶速度取1-6之间的随机值 t=(int)(Math.random()*5+1);}//未有纵向车辆通过路口时,允许横向向车辆通行if((b>750&&d>750)||(b<400&&d<400)||(b>750&&d<400)){ m=(int)(Math.random()*5+1); s=(int)(Math.random()*5+1);}其中m、n、s、t分别控制右方、上方、左方、下方来车的速度,a、b、c、d分别控制右方、上方、左方、下方车的横坐标或纵坐标位置。该方法不仅代码更为简洁,而且判断更为严谨,可以模拟川流不息的车流。同时车流运用了随机值来控制车速,使得模拟效果更为真实。十字路口的智能让行关键思路和代码二、举一反三思路三:将每辆小车视作对象,运用面向对象程序设计思想完成项目。classCar{//小车类intx;//小车坐标 inty; Car(intx,inty){ this.x=x; this.y=y; }}创建小车类和十字路口类,给出小车的位置和十字路口的状态。classCross{//十字路口类intcountX,countY;//记录横纵向小车是否进入路口的变量Cross(){ this.countX=0; this.countY=0;}//路口状况booleanSituation(){ if(this.countX!=0&&this.countY!=0){ returnfalse;//横纵向小车同时出现在十字路口 }elsereturntrue;//其它情况}}3、体育场的角逐二、举一反三模拟多名参赛选手在白色跑道上奋力拼搏的过程,比赛结果具有随机性。//对多个线程的创建和启动Thread[]player=newThread[6];for(inti=0;i<6;i++){ player[i]=newThread(m); player[i].start();}//每个参赛队员的位置坐标(x,y)int[]x=newint[6];int[]y=newint[6];龟兔赛跑1举一反三23银行取款银行取款银行取款模拟多线程的同步多线程的等待唤醒机制举一反三妈妈的爱十字路口的智能让行体育场的角逐龟兔赛跑传统的龟兔赛跑真实的赛场角逐多线程及其生命周期第8章人尽其才,物尽其用——多线程三、银行取款1、银行取款模拟

假设银行目前有100万元现金,两位顾客同时在不同的窗口办理取款业务,每人取款20万元。为了保证安全,银行要求单笔取款金额不能超过5万元,要取到20万需要分四笔业务办理。同时,为了提升服务效率,银行在办理业务时不会等一个窗口办理完毕后再开启下一个窗口,而是不同窗口同时进行。这就需要银行系统有统筹协调的能力,不仅要保证每个窗口服务时间基本均衡,而且还要随时保证所取金额和剩余金额的正确性,因此我们选用多线程对整个取款过程进行模拟。在Java中对资源加锁的处理方法非常简单,使用synchronized关键字修饰相应方法或代码块即可。如前面取款方法take():publicsynchronizedstaticvoidtake(intk){//取款

……}也可以写成如下形式:publicstaticvoidtake(intk){//取款

synchronized(this){……}}三、银行取款2、多线程的同步【例8-5】线程的同步控制三、银行取款3、多线程的等待唤醒机制线程通信

当多个线程共同完成一件任务,而每个线程的子任务又不同时,需要线程之间的相互协作和通信,以确保任务的顺利完成,同时又能高效地利用资源。比如对于产品而言,一个线程负责生产,另一个线程负责消费,在产品未生产出来之前无法消费,相反,产品出现积压则需要暂停生产,那么两线程之间就需要保持密切的联系,这就是线程的通信。在Java中处理线程通信的机制称为等待唤醒机制。等待唤醒机制

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论