- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第的七章 线程(4学时)
第七章 线程 目 录 7.1 多线程编程基础 7.2 线程的生命周期及调度 7.3 线程间的数据共享 7.4 线程间的同步控制 7.5 线程间的通信 7.6 后台线程 7.7 死锁 7.8控制线程的生命 7.1 多线程编程基础 进程:一个独立程序的每一次运行; 一、Thread类 封装了Java程序中一个线程对象需要拥有的属性和方法; 例7-1:在新线程中完成计算某个整数的阶乘。 修改后运行结果: main thread starts new thread stared The factorial of 10 is 3628800 new thread ends main thread ends 运行结果说明: 新线程结束后main线程才结束 例7-2:创建3个新线程,每个线程睡眠一段时间(0~6秒),然后结束。 运行结果: Starting threads Threads started, main ends thread1 going to sleep for 3519 thread2 going to sleep for 1689 thread3 going to sleep for 5565 thread2 finished thread1 finished thread3 finished 二、Runnable接口 相对于Thread类, Runnable更适合于多个线程处理同一资源,它只有一个run()方法; 7.2 线程的生命周期及调度 线程从产生到消亡的过程 ; 线程的几种基本状态: 诞生状态 线程刚刚被创建 就绪状态 线程的 start 方法已被执行 线程已准备好运行 运行状态 处理机分配给了线程,线程正在运行 7.2.2 线程调度和优先级 线程调度 在单CPU的系统中,多个线程需要共享CPU,在任何时间点上实际只能有一个线程在运行,控制多个线程在同一个CPU上以某种顺序运行称为线程调度; Java虚拟机支持一种非常简单的、确定的调度算法,叫做固定优先级算法。这个算法基于线程的优先级对其进行调度。 基于线程优先级的线程调度: 具有较高优先级的线程比优先级较低的线程优先执行; 对具有相同优先级的线程,Java的处理是随机的; 底层操作系统支持的优先级可能要少于10个,这样会造成一些混乱。因此,只能将优先级作为一种很粗略的工具使用。最后的控制可以通过使用yield()函数来完成。 例7-5:创建两个具有不同优先级的线程,都从1递增到200000,每增加50000显示一次。 class TestThread extends Thread{ private int tick = 1,num; public TestThread(int i) { this.num=i;} public void run() { while (tick 200000) { tick++; if ((tick % 50000) == 0) { //每隔5000进行显示 System.out.println(Thread # + num + , tick = + tick); yield(); //放弃执行权 } } } } 运行结果(不准确): Thread #1, tick = 50000 Thread #1, tick = 100000 Thread #1, tick = 150000 Thread #1, tick = 200000 Thread #0, tick = 50000 Thread #0, tick = 100000 Thread #0, tick = 150000 Thread #0, tick = 200000 如果在yield方法后增加一行sleep语句,让线程1暂时放弃一下在CPU上的运行,哪怕是1毫秒,则线程0也可以有机会被调度。修改后的run方法如下: public void run() { while (tick 400000) { tick++; if ((tick % 50000) == 0) { System.out.println(Thread # + num + , tick = + tick); yield(); try{ sleep(1);}catch(Exception e){}; } } } 运行结果(不准确):
文档评论(0)