电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

Java语言第13章 Java多线程机制

25页
  • 卖家[上传人]:梦**
  • 文档编号:59425206
  • 上传时间:2018-11-07
  • 文档格式:PPT
  • 文档大小:179KB
  • / 25 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、13.1 Java中的线程 13.2 通过继承Thread类实现多线程 13.3 通过Runnable接口实现多线程 13.4 线程的调度 13.5 线程的同步,第13章 Java多线程机制,13.1 Java中的线程,计算机的发展日新月异,个人计算机上的操作系统也纷纷采用多任务和分时设计,将早期只有大型计算机才具有的系统特性带到了个人计算机系统中。一般可以在同一时间内执行多个程序的操作系统都有进程的概念。一个进程就是一个执行中的程序,而每一个进程都有自己独立的一块内存空间、一组系统资源。在进程概念中,每一个进程的内部数据和状态都是完全独立的。,13.1.1 进程与线程,进程是程序的一次动态执行过程,它对应了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程。如果把公司一天的工作比作一个进程,那么早上公司开门上班是进程的开始,晚上下班关门是进程的结束。,13.1.1 进程与线程,线程是比进程更小的执行单位。一个进程在其执行过程中,可以产生多个线程,形成多条执行线索,每条线索,即每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的概念。就像公司一

      2、天的工作开始后,可以有多个不同的“线程”进行运作,如财务部门、开发部门、销售部门等。,13.1.2 线程的状态,一个线程在任何时候都处于某种线程状态。线程的几个主要状态有创建、运行、中断和死亡4 种状态。 创建(New Thread) Java的线程是通过java.lang.Thread类来实现的。当我们生成一个Thread类的对象之后,一个新的线程就产生了。执行下列语句时,线程就处于创建状态: Thread myThread = new MyThreadClass(); 当一个线程处于创建状态时,它仅仅是一个空的线程对象,系统不为它分配资源。,13.1.2 线程的状态,运行(Runnable) 线程创建之后就具备了运行的条件,一旦轮到它来享用CPU 资源时,就可以脱离创建它的主线程独立开始自己的生命周期了。执行下列语句时,线程就处于运行状态: Thread myThread = new MyThreadClass(); myThread.start(); 当一个线程处于可运行状态时,系统为这个线程分配了它所需的系统资源,安排其运行并调用线程运行方法,这样就使得该线程处于可运行(Run

      3、nable)状态。,13.1.2 线程的状态,中断(Not Runnable) 一个正在执行的线程可能被人为地中断,使其让出CPU的使用权,暂时中止自己的执行,进入阻塞状态。 进入中断状态的原因有如下几条: 调用了sleep() 方法; 调用了suspend() 方法; 为等候一个条件变量,线程调用wait() 方法; 输入输出流中发生线程阻塞。,13.1.2 线程的状态,死亡(Dead) 处于死亡状态的线程不具有继续运行的能力。线程死亡的原因有两个,一个是正常运行的线程完成了它的全部工作,另一个是线程被提前强制性地终止。所谓死亡状态就是线程释放了实体,即释放分配给线程对象的内存。,13.1.3 多线程的实现方法,在Java中,创建线程的方法有两种:一种方法是通过创建Thread类的子类来实现,另一种方法是通过实现Runnable接口的类来实现,具体如下。 方法一:定义一个线程类,它继承线程类Thread并重写其中的方法run() . 重继承,用这种方法定义的类不能再继承其他父类。 方法二:提供一个实现接口Runnable的类作为一个线程的目标对象,在初始化一个Thread类或者Thr

      4、ead子类的线程对象时,把目标对象传递给这个线程实例,由该目标对象提供线程体run() 。,13.2 通过继承Thread类实现多线程,通过继承Thread类实现多线程的方法是首先设计Thread的子类,然后根据工作需要重新设计线程的run方法,再使用start方法启动线程,将执行权转交给run。 例13-1 程序清单 TwoThreads_Test.java,13.2 通过继承Thread类实现多线程,仔细分析一下运行结果,会发现两个线程是交错运行的,感觉就像是两个线程在同时运行。但是实际上一台计算机通常就只有一个CPU,在某个时刻只能有一个线程在运行,而java语言在设计时就充分考虑到线程的并发调度执行。对于程序员来说,在编程时要注意给每个线程执行的时间和机会,主要是通过让线程睡眠的办法(调用sleep() 方法)来让当前线程暂停执行,然后由其他线程来争夺执行的机会。如果上面的程序中没有用到sleep() 方法,则就是第一个线程先执行完毕,然后第二个线程再执行完毕。所以用活sleep() 方法是学习线程的一个关键。,13.3 通过Runnable接口实现多线程,通过Runnable

      5、接口实现多线程的方法是首先设计一个实现Runnable接口的类,然后根据工作需要重新设计线程的run方法;再建立该类的对象,以此对象为参数建立Thread类的对象;调用Thread类对象的start方法启动线程,将执行权转交到run方法。 例13-2 程序清单 Runnable_Test.java,13.3 通过Runnable接口实现多线程,构造线程体的两种方法的比较: 直接继承Thread类 不能再从其他类继承; 编写简单,可以直接操纵线程,无需使用Thread.currentThread() 。 使用Runnable接口 可以将CPU、代码和数据分开,形成清晰的模型; 还可以从其他类继承; 保持程序风格的一致性。,13.4 线程的调度,Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程。线程调度器按照线程的优先级决定应调度哪些线程来执行。 当一个在就绪队列中排队的线程被分配到处理器资源而进入运行状态之后,这个线程就称为是被“调度”或被线程调度管理器选中了。线程调度管理器负责管理线程排队和处理器在线程间的分配,一般都配有一个精心设计的线程调度算法。在Java系统中,

      6、线程调度依据优先级基础上的“先到先服务”原则。,13.4 线程的调度,下面几种情况下,当前线程会放弃CPU: 线程调用了yield() 或sleep() 方法主动放弃; 抢先式系统下,由高优先级的线程参与调度;时间片方式下,当前时间片用完,由同优先级的线程参与调度; 由于当前线程进行I/O访问,外存读写,等待用户输入等操作,导致线程阻塞;或者是为等候一个条件变量,以及线程调用wait() 方法。,13.4 线程的调度,Thread 类的setPriority(int a)方法可以设置线程优先级,使之符合程序的特定需要。a 取值是:Thread.MIN_PRIORITY、Thread.MAX_PRIORITY、Thread.NORM_PRIORITY。线程的默认级别是Thread.NORM_PRIORITY。 下述方法可以对优先级进行操作: int getPriority(); /得到线程的优先级 void setPriority(int newPriority); /当线程被创建后,可通过此方法改变线程的优先级,13.5 线程的同步,终止线程 线程终止后,其生命周期结束了,即线程进入死

      7、亡状态,终止后的线程不能再被调度执行,以下两种情况,线程将进入终止状态: 线程执行完其run() 方法后,会自然终止。 通过调用线程的实例方法stop() 来终止线程。,13.5 线程的同步,测试线程状态 可以通过Thread 中的isAlive() 方法来获取线程是否处于活动(Alive)状态;线程由start() 方法启动后,直到其被终止之间的任何时刻,都处于活动状态。,13.5 线程的同步,线程的暂停和恢复 有以下几种方法可以暂停一个线程的执行,在适当的时候再恢复其执行。 sleep() 方法 当前线程睡眠(停止执行)若干毫秒,线程由运行中状态进入不可运行状态,停止执行时间到后线程进入可运行状态。 suspend() 和resume() 方法 线程的暂停和恢复,通过调用线程的suspend() 方法使线程暂时由可运行态切换到不可运行态,若此线程想再回到可运行态,必须由其他线程调用resume() 方法来实现。但从JDK1.2开始就不再使用suspend() 和resume() 。,13.5 线程的同步,join() 方法 当前线程等待调用该方法的线程结束后,再恢复执行。例如: T

      8、imerThread tt=new TimerThread(100); tt.start(); public void timeout() tt.join(); / 当前线程等待线程tt 执行完后再继续往下执行 ,13.5.2 多线程的同步实现,在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题。我们首先编写一个非常简单的多线程的程序,来模拟银行中的多个线程同时对同一个储蓄账户进行存款、取款操作。,13.5.2 多线程的同步实现,在程序中我们使用了一个简化版本的Account类,代表了一个银行账户的信息,账户上现有余额2000元。在主程序中我们首先生成了1000个线程,然后启动它们,每一个线程都对Mike的账户进行存100元,然后马上又取出100元。这样,对于Mike的账户来说,最终账户的余额应该还是2000元才对,然而运行的结果却超出我们的想像。首先来看看我们的演示代码: 例13-4 程序清单 Synchronized_Test.java,13.5.2 多线程的同步实现,注意:上面在Account的deposit和withdraw方法中之所以要把对amount(数额)的运算使用一个临时变量首先存储,睡眠(sleep)一段时间后再赋值给amount,这是为了模拟真实系统运行时的情况。因为在真实系统中,账户信息肯定是存储在数据库中,此处的睡眠时间相当于比较耗时的数据库操作,最后把临时变量tmp的值赋值给amount,这相当于把amount的改动写入数据库中。运行Synchronized_Test:,13.5.2 多线程的同步实现,我们发现,程序每一次运行的结果都会不同,为什么会出现这样的问题?这就是多线程中的同步的问题。在程序中,Account类中的amount会同时被多个线程所访问,这就是一个竞争资源,通常称作竞态条件。对于这样的多个线程共享的资源我们必须进行同步,以避免一个线程的改动被另一个线程所覆盖。,13.5.2 多线程的同步实现,在Java中,实现同步操作的方法是在共享内存变量的方法前加synchronized修饰符。在程序运行过程中,如果某一线程调用经synchronized修饰的方法,在该线程结束此方法的运行之前,其他所有线程都不能运行该方法,只有等该线程完成此方法的运行后,其他线程才能引入该方法的运行。,

      《Java语言第13章 Java多线程机制》由会员梦**分享,可在线阅读,更多相关《Java语言第13章 Java多线程机制》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    监控施工 信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.