- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java编程课外实验2new.doc
实验名称( Java 编程基础(二))——课外
姓 名___沈媛媛_____ 学号__110342223___
实验日期 2013 年 10月25 日 实验报告日期 2013 年10月 25日
成 绩 ___________________
实验目的
1、 理解并掌握 Java 中接口的基本概念和具体应用
2、 熟悉掌握Java 中线程的定义和基本操作
3、 理解线程池的概念,以及常用的线程调度方法
实验环境
1、 准备 SUN 的JDK6 安装文件
2、 Java 程序开发软件一套——MyEclipse6.0
实验实际完成内容及结果分析
请上机调试并运行下面的程序,并回答以下问题:
程序源代码如下图:
(1) 本程序执行时共创建了多少线程,分析给出程序的运行结果,说明各线程的执行情况。
答:Thread[Thread-1,10,main]Created表示名为Thread-1的线程被创建,优先权是10,执行完后Thread-0被创建优先权是4(Thread[Thread-0,4,main]Created),此时Thread-0因优先级低而被阻塞,当Thread-1执行完后Thread-0执行。
(优先权只是系统执行线程的一个参考标准,最后是哪个线程先执行要看操作系统,启动线程只是让线程处于就绪状态)
(2) 去掉语句块 1 的注释,执行程序并分析程序的运行结果,说明Thread.sleep(2*1000);这条语句对线程调度的影响。
答:共创建了两个线程,Thread-0和Thread-1两个线程,Thread2(Thread-1)的Run()方法中有Thread.sleep(2*1000),所以Thread-1每过2秒(2秒在休眠,2秒过后继续执行线程)被打印一次,总共被答应10次,线程的调度看Run()函数中的,而主函数中的对其没有影响。
运行结果如下:
(3)去掉语句块 2 的注释,执行程序并分析程序的运行结果,说明if(count==1) thread2.interrupt();这条语句对线程调度的影响。
Thread1创建线程Thread-0,Thread2创建Thread-1,当count=1时,Thread-1没睡到2m被唤醒,此时Threa-0线程继续运行所以打印2,3。Thread-1接到被唤醒命令打印“睡眠被中断了”,继续每过两秒打印一次,而Thread-0此时早运行完。
2、 请上机调试并运行本章例题中的线程池程序,给出程序的运行结果,并回答以下问题:
多线程对多个文件的压缩运行结果如下:
(1) 本例中是如何定义池(pool)的(采用了什么样的数据结构类),池的作用是什么,对池的操作有哪些,分别是如何实现的。
答:先创建队列或者列表作为池,第一次创建池时分配固定数量的线程。
池的作用:用来保存任务的数据结构。
对池的操作:向池中添加新的任务、通知线程有新的任务需要做。
通过调用pool.add()和pool.notifyall()来实现。threads[i].start();
(2) 本例中线程池中共定义了多少个线程,这些线程是如何调度执行的,使用了哪些线程调度的方法。
答:共定义了4个线程,线程的调度方法有threads[i].interrupt();pool.wait();,
(3)如果将该线程池的任务改为计算给定文件夹下所有文件的摘要信息,应该如何修改源程序。
思考题
1、 请总结本章共介绍了几种返回线程中信息的方法,各方法分别是如何返回线程信息的?
返回线程中信息的方法:
--轮询:不停的对digest进行判断,只有当digest不为空时,在调用digest返回
--回调:用回调方(CallBack)法,我们不必像之前总是询问是否每一个线程对象是否执行完毕,而是让线程告诉主程序何时结束,他通过调用主类的一个方法来做到这一点。
实验总结和体会
对于返回线程中信息的方法认识:Run()和Start()方法都没有返回值,所以对于线程中信息的返回可以用轮询和回调,轮询就是不停的对digest进行判断,只有当digest不为空时才将digest中的内容返回,回调则是线程的Run()方法快要结束时,通知主程序记录结果,实现方法通过调用主程序中的方法来实现。
对线程的调度只是在Run()方法中,主函数中的调度不影响线程
线程池认识:通过创建工作队列来实现线程池,工作队列的类型可以是队列也可以是列表等,同时定义固定个数的线程,将新的任务插入工作队列的头部,这时通知一个线程(或者是多个)
文档评论(0)