




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十章多线程,2,本讲内容,11.1线程的概念11.2线程的状态11.3多线程编程11.4线程同步,3,11.1线程的概念,人们常说做事情要一心一意,不能三心二意。在现实世界中,其实很多事情可以并发执行的。比如,人体在接受外界信息时,视觉、嗅觉、听觉、味觉、触觉这些感知器官统统都是并发执行的。所谓眼观六路、耳听八方。随着科学技术的发展,计算机也进入了三心二意的时代。大家在使用计算机的时候,可以同时运行两个甚至两个以上的程序:比如一边听歌、一边上网看新闻,还可以同时下载电影。,4,11.1线程的概念,那么计算机中怎样才可以实现多个程序的同时运行呢?虽然,在计算机中这些程序似乎同时在运行,但事实并非如此。除非你的计算机上装有两个CPU(双核处理器),否则同一时刻只能运行一个程序。,5,11.1线程的概念,如果CPU只有一个,这时就遇到这样的问题,到底怎样才能既听歌又能看网页呢?操作系统的进程并发机制可以帮助我们实现这一目的。实际情况是由操作系统负责管理CPU等硬件资源的分配,通过采用时间片原理,以非常小的时间间隔交替执行多个程序。因此,给我们大家一种多个程序被同时执行的错觉,即并发执行。,上网,听歌,6,我们把支持并发执行的操作系统称为多任务操作系统。操作系统不仅要管理计算机的各个硬件资源(例如CPU)的分配,还要管理软件的执行。操作系统对于程序的管理是通过这样一种方式,即为每个程序都建立一个进程,然后通过对进程进行管理从而间接的管理程序。,7,每个进程又可以进一步细分成多个线程,多线程意味着一个程序的多行语句同时执行。程序员可以在程序中加入多线程,每个线程完成程序的一部分功能,并可以和其他线程并发执行。例如,我们在网上在线看电影,一般不需要等到电影下载完才观看,而是一边下载,一边看。这时就启动了两个线程,一个线程用来下载,另一个用来播放已经下载的数据。,8,程序进程线程,程序是为完成特定任务、用某种语言编写的一组指令的集合。是一段静态的代码。进程是程序的一次执行过程,是系统进行调度和资源分配的一个独立单位。是动态的概念。线程是比进程更小一级的执行单元。一个进程在其执行过程中,可以产生多个线程,形成多条执行线索。每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的概念。,9,程序进程线程,为什么要引入线程?线程创建、销毁和切换的负荷远小于进程;可以降低系统的负荷,主要是CPU的负担。,10,进程与多线程,进程是正在运行的一个程序。程序:静态对象进程:动态过程。操作系统会为每个进程分配一段内存空间,包括:代码、数据以及堆栈等资源。多线程是指在进程内部同时存在几个执行体,按几条不同的执行线索共同工作。线程不能独立存在,必须存在于进程内部,多线程之间共享该进程的内存。进程之间并发执行,而多线程则实现了进程内部的并发。,11,传统进程的并发执行,并发执行,12,多线程进程的并发执行,并发执行,进程内部并发执行,进程内部并发执行,13,Java与多线程,Java语言的一个重要特点就是对多线程的支持,它使得编程人员可以很方便地开发出具有多线程功能、能同时处理多个任务的应用程序。每个Java程序都有一个隐含的主线程。Application:main方法Applet小程序:主线程指挥IE浏览器加载并执行Java小程序。,14,11.2线程的状态,要想实现多线程,必须在主线程(main方法)中创建新的线程对象。Java使用Thread类及其子类的对象来表示线程。线程从创建到执行完毕的整个过程叫做线程的生命周期。,15,11.2线程的状态,一个线程在其生命周期内总是处于某种状态:创建:当一个线程对象被声明并创建后,它处于“创建”状态;就绪:线程对象调用start()方法后,将进入“就绪”状态,处于“就绪”状态的线程不是立即执行,而是进入就绪队列,等待CPU;运行:当就绪队列中具有最高优先级的就绪线程被调度并获得CPU时,便进入“运行”状态,执行run()方法,run方法中定义了线程的操作和功能;非运行:处于“运行”状态的线程可能因为某些原因(例如人为挂起)进入“非运行”状态,让出CPU并临时中止自己的执行;停止:线程完成了它的全部工作或调用stop()方法强制中止线程,线程就进入“停止”状态。,16,线程的生命周期,就绪,停止,非运行,运行,创建,start(),run(),sleep(),wait(),notify(),stop(),CPU调度,17,11.3多线程编程,Java中有两种方法来创建一个新的线程:继承Thread类实现Runnable接口无论采用哪种方法,都要使用到Thread类及其相关的方法。Thread类的方法start(),run(),stop()创建线程和创建普通类的对象其实是一样的。,18,11.3.1创建线程,1.继承Thread类来创建线程Thread类综合了一个线程所需的变量和方法。当创建一个Thread类的对象之后,一个新的线程就诞生了。每个线程都是通过执行run()方法来完成其功能和操作的。run()方法又称为线程体。但是由于Thread类中的run()方法是个空方法,所以我们必须继承Thread类,并且在子类中重写Thread类的run()方法,把线程需要完成的功能添加到该方法中。,19,classOppositeThreadextendsThreadintnum;OppositeThread(intnum)this.num=num;publicvoidrun()/重写Thread类中的run()方法System.out.println(-num);publicstaticvoidmain(Stringargs)OppositeThreadp=newOppositeThread(18);/创建线程p.start();/启动线程p,注意:当我们要启动一个线程时,不是直接调用run()方法,而是调用start()方法。start()方法产生运行线程所需的资源,并且自动调用run()方法。,20,classE11_2extendsThreadintcount=1,number;publicE11_2(intnum)number=num;System.out.println(创建线程+number);publicvoidrun()/重写Thread类中的run()方法while(true)System.out.println(线程+number+,第+count+次循环);if(+count=3)return;publicstaticvoidmain(Stringargs)for(inti=0;i6;i+)newE11_2(i+1).start();/创建并启动线程,创建类E11_2的对象,即线程,21,Thread类的有关方法,voidstart();StringgetName();/返回线程的名称run();staticvoidsleep(时间);stop();/强制结束线程booleanisAlive();/返回boolean值,表明线程是否存在staticcurrentThread();/返回当前线程,22,2.实现Runnable接口来创建线程,首先定义一个实现Runnable接口的类,在该类中定义自己的run()方法,然后以该类的对象作为参数调用Thread类的构造方法来创建一个线程。最后,同样使用start()方法启动线程。,23,classE11_3implementsRunnableintcount=1,number;publicE11_3(intnum)number=num;System.out.println(创建线程+number);publicvoidrun()/重写Thread类中的run()方法while(true)System.out.println(线程+number+:计数+count);if(+count=3)return;publicstaticvoidmain(Stringargs)for(inti=0;i8;i+)newThread(newE11_3(i+1).start();,创建类E11_3的对象,非线程,创建类Thread的对象,即线程,启动线程,24,11.3.2线程的优先级和调度,每个线程都有自己的优先级,通常用三个常量表示:MAX_PRIORITY10;MIN_PRIORITY1;NORM_PRIORITY5;getPriority()返回线程的优先级setPriority(intnewPriority)设置线程的优先级每个新线程都继承它的父线程的优先级。优先级高的线程将先于优先级低的线程执行。,25,classE11_4publicstaticvoidmain(Stringargs)System.out.println(线程名t优先级);Threadcurrent=Thread.currentThread();/返回当前线程对象mainSystem.out.println(current.getName()+t+current.getPriority();Threadt1=newRunner();/创建线程对象t1Threadt2=newRunner();/创建线程对象t2Threadt3=newRunner();/创建线程对象t3t1.setName(First);t2.setName(Second);t3.setName(Third);t2.setPriority(Thread.Max_PRIORITY);/设置线程t2的优先级t1.start();t2.start();t3.start();/启动线程classRunnerextendsThreadpublicvoidrun()/重写Thread类中的run()方法System.out.println(this.getName()+t+this.getPriority();,26,程序运行结果,线程名优先级main5Second10First5Third5,由于main线程是程序的入口,所以首先启动,而Second线程的优先级比另外两个高,所以在main之后启动。,27,11.4线程同步,问题的提出有时同时运行的多个线程需要共享数据,为了保证数据操作的完整性,Java引入互斥机制,用来保证任一时刻只有一个线程访问共享数据。例如,同一时刻一个线程A正在处理数据,而另一个线程B开始读取该数据,线程B没有等到线程A处理完数据就去读取数据,肯定会导致一个错误的结果。,28,问题的解决Java采用synchronized关键字来给需要访问共享数据的方法加锁;被加锁的方法称为同步方法。一次只能有一个同步方法是活动的,其他同步方法必须等待该方法访问完共享数据才能访问它。,29,堆栈就是一个典型的共享数据,必须互斥地访问。publicclassstackinti=0;chardata=newchar7;publicsynchronizedvoidpush(charc)datai=c;i+;publicsynchronizedcharpop()i-;returndatai;,30,i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年奢华别墅建筑与全面维护保养服务合同
- 2025年知识产权保密协议翻译及保密管理培训服务合同
- 海运知识培训课件
- 2025年压路机租赁与综合施工技术咨询服务协议
- 2025年学历类自考企业文化-生产与作业管理参考题库含答案解析(5套试卷)
- 2025年学历类自考企业文化-国民经济统计概论参考题库含答案解析(5套试卷)
- 2025年学历类自考企业会计学-教育学(一)参考题库含答案解析(5套试卷)
- 2025年学历类自考企业会计学-中国现代文学史参考题库含答案解析(5套试卷)
- 金融业务知识培训心得
- 2025年跨境电商平台跨境支付结算服务全面合作协议
- 人教版六年级数学上册【全册教案】
- 合同法风险防范培训
- 管理会计学(第6版) 课件 郭晓梅 第1-3章 管理会计导论、成本性态分析与变动成本计算法、作业成本计算法
- 2024版门面租赁合同书范本下载
- 中小学教师专业技术岗位聘任考核方案
- 2024-2025学年高三上学期《为什么要上一个好大学?》主题班会课件
- 职业技术学校物联网应用技术专业调研报告
- GB/T 43934-2024煤矿土地复垦与生态修复技术规范
- 2023年某技术有限公司技术规范
- 秋季传染病预防课件幼儿园
- 江苏农牧科技职业学院单招《英语》考试参考题库(含答案)
评论
0/150
提交评论