版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、电子课件JAVA语言程序设计java07第7章多线程7.1并发性、线程与多线程7.2获得线程体的两种方法7.3线程调度本章目录7.1并发性、线程与多线程一、并发性的概念目前的计算机操作系统大多支持并发性,即多个进程是交叉执行的,一般称多进程为系统级并发。Java语言通过程序控制流来执行程序,单个的一段程序执行控制流称为线程。多线程指的是在单个程序内部可以同时运行多个相同或不同的线程来执行不同的任务。线程与操作系统中的进程有些类似,在同一时刻操作系统中可以运行多个进程,但是线程则更进一步,将并发推进到语言级,所以说Java语言支持语言级并发。在单个程序内部也可以在同一时刻有多个线程在进行不同的运
2、算。多线程也需要系统通过分配处理器的运行时间进行调度以提高整个程序的运行效率。二、线程的状态与生命周期一个线程在其生命生存时段内的任一时刻都处于某一种线程状态,线程在从其生命开始到结束的时间内将可能经历从出生态到死亡态的多种状态,这构成了它的生命周期。线程的状态包括以下7种:出生态(Born state),也称为新线程(New Thread)。就绪态(Ready state),也称为可运行线程(Runnable Thread)。运行态(Running state)。休眠态(Sleeping state)。等待态(Waiting state)。阻塞态(Blocked state)。死亡态(Dea
3、d state)。特别的线程关系:某个线程只有在另一个线程终止时,才能继续执行,这种线程称为依赖线程。此时依赖线程可以调用另一个线程的join()方法。当另一个线程转化为死亡态时,依赖线程会脱离等待态而转化为就绪态。在一个系统中,任何时刻最多都只能有一个运行态线程。出生态就绪态阻塞态死亡态运行态休眠态等待态start()获得处理器yield()完成任务或终止等待任务wait()sleep()任务完成interrupt()休眠时间到interrupt()等待时间到interrupt()notify()notifyall()线程生命周期中的状态转化示意图7.2获得线程体的两种方法一、Thread类
4、和Runnable接口线程从根本上讲是一段程序代码序列,还需要在程序中实现。java.lang包中定义了Thread类,是Java语言多线程程序设计的基础和关键。Thread类是java.lang.Object类的直接子类,其中定义的一些方法成员完成与线程有关的操作:interrupt() /中断线程join() /等待该线程终止join(long millis) /等待该线程终止,在指定的毫秒数内join(long millis, int nanos) /等待该线程终止,在指定的毫秒数加指定的纳秒数内sleep(long millis) /休眠当前正在执行的线程,在指定的毫秒数内sleep(
5、long millis, int nanos) /休眠当前正在执行的线程,在指定的毫秒数加指定的纳秒数内start() /使该线程开始执行yield() /暂停当前正在执行的线程,并执行其他线程notify() /唤醒在此对象监视器上等待的单个线程notifyAll() /唤醒在此对象监视器上等待的所有线程wait() /导致当前的线程等待wait(long timeout) /导致当前的线程等待timeout毫秒wait(long timeout, int nanos) /导致当前的线程等待timeout毫秒加nanos纳秒isAlive() /测试线程是否处于活动状态isInterrupt
6、ed() /测试线程是否已经中断getPriority() /返回线程的优先级getId() /返回线程的标识符getName() /返回线程的名称getState() /返回线程的状态setPriority(int newPriority) /更改线程的优先级setName(String name) /改变线程名称,使之与参数name相同在java.lang包中还定义了Runnable接口,其中只有一个run()方法,这个run()方法的作用与Thread类中的run()方法在定义线程体时的作用是一样的。Java语言支持多线程,线程在Application程序和Applet程序中都可以使用,
7、在Applet中使用得更普遍一些。线程的行为由线程体确定,线程体是线程的主体,含有线程的具体内容。Java语言程序中实现线程的程序设计的关键是使主程序获得run()方法并重写run()方法,重写了run()方法也就定义了线程体。根据获得run()方法的途径不同,定义线程体有两种完全等价的方式。二、通过继承Thread类获得线程体在java.lang.Thread类中定义有run()方法,可以在当前程序中通过继承Thread类间接继承run()方法,并在程序中重写该方法而构造出线程体。三、通过实现Runnable接口获得线程体由于Java语言不支持多重继承,因此如果用来获得线程体的类已经继承了其
8、他的类,这个方法在使用中就会受限制。可以在当前程序中实现Runnable接口并重写run()方法,从而构造出线程体。这种方法比较多见于编写Applet程序,当一个Applet程序的线程体必须要在主类中实现的时候,就别无选择地要使用实现Runnable接口的方法,与前一种方法相比,这种方法的效果是一样的。多个线程同时在一个程序中执行,要通过系统的线程调度获得处理器才能执行,所以完全可能出现一个线程还没有执行完就被迫停下来而由另一个线程取而代之获得处理器的情况,所以就会出现同一个线程所执行的内容的顺序是固定的,而多个线程的执行内容的顺序就可能出现不同的组合的结果,这种现象称为线程的不确定性。7.3
9、线程调度一、线程的优先级每个线程都有自己的优先级。当Java线程被创建时,该线程从父线程中继承优先级并保持一致。线程被创建后,可以改变线程的优先级。线程的优先级定义为10级,分别用数字1到10表示。在Thread类中还定义了几个描述线程的优先级的字段:最高优先级MAX_PRIORITY对应10级,默认优先级NORM_PRIORITY对应5级,最低优先级MIN_PRIORITY对应1级。线程的优先级的作用是方便操作系统调度线程,操作系统总是让优先级高的线程先于优先级低的线程执行。对于优先级相同的线程,在不采用分时技术的操作系统中总是让一个线程一直运行直到完成任务,除非它自己转化为休眠态、等待态或
10、阻塞态;在采用分时技术的操作系统中每个线程都将获得称为时间片的处理器运行时间以使线程能够运行。可以通过调用Thread类的getPriority()方法获取线程的优先级,setPriority()方法更改线程的优先级。二、线程同步线程在访问共享对象时不允许其它线程访问该对象的情况称为线程互斥或线程同步。线程同步与计算机操作系统中的进程同步很相似。Java语言采用监控器机制来实现线程同步,监控器机制也称为获得锁。在Java语言中为每个对象都设置了一个监控器,监控器每次只允许一个线程来执行对象的同步语句,当程序控制流进入同步语句时,将对象锁住,从而实现线程同步。任意一个时刻如果有多条语句试图使对象
11、同步则只能有一条同步语句被激活,其它所有试图对同一对象实现同步的线程都将被迫处于阻塞态。当实现线程同步的语句完成执行过程之后,监控器才会打开对象的锁并按照线程调度原则处理其它的同步语句,分配处理器时间。在Java语言程序设计中,可以采用“synchronized”关键字实现同步方法,具体用法就是在程序中进行方法定义时用“synchronized”关键字说明方法,使得方法具有同步属性,任一时刻只有一个线程能够调用带有同步属性的方法。还可以在程序中使用wait()方法使一个暂时没有获得完全的条件,无法对该对象继续执行任务的线程进入等待态。当一个线程完成了自己的同步语句并执行完自己的代码使得其它的线
12、程所等待的条件得以满足之后,也可以通过使用notify()方法将一个正处于等待态的线程再次转为就绪态。也可以通过使用notifyAll()方法将所有处于等待态的线程再次转为就绪态。转为就绪态的线程都有机会获得对象的锁,但是任一时刻最多只能有一个线程获得对象的锁,其余的线程都将处于阻塞态。有几个问题是在编写线程同步程序时应该注意的:当对象的锁被释放时,阻塞线程调用一个用“synchronized”关键字说明的方法并不保证一定就能立刻成为下一个获得锁的线程。调用了监控器的wait()方法成为等待态的线程经由其它线程调用notify()方法之后并不保证一定会脱离等待态。在同步方法中建议在wait()方法之前调用notifyAll()方法唤醒所有等待态线程,包括该线程自身,而将同步线程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年医学装备管理制度试题范文附答案
- 写字楼智能安防系统设计与实施方案
- 安全员A证考试题库附参考答案详解(b卷)
- 全国计算机专业教学设计竞赛方案
- 2025年汽车行业智能驾驶辅助系统技术知识考察试题及答案解析
- 园林绿化养护年度计划与执行方案
- 押题宝典安全员A证考试题库【新题速递】附答案详解
- 2025年二级建造师《矿业实务》真题及答案解析
- 安全员A证考试考前冲刺练习试题完美版附答案详解
- 物流实习岗位职责与考核方案
- DB34-T 4021-2021 城市生命线工程安全运行监测技术标准
- 农艺工教学计划
- TSZSA 015-2024 COB LED光源封装产品技术规范
- 2024新外研社版英语七下单词默写表(开学版)
- 卫生管理组织制度模版(2篇)
- 《游园》课件统编版高中语文必修下册
- 质量责任划分制度
- 2024版美团商家合作协议合同范本
- 一年级上册数学应用题50道(重点)
- 嵌入式系统实现与创新应用智慧树知到期末考试答案章节答案2024年山东大学
- 线缆及线束组件检验标准
评论
0/150
提交评论