项目8讲解材料

上传人:yuzo****123 文档编号:140132147 上传时间:2020-07-27 格式:PPT 页数:48 大小:996.50KB
返回 下载 相关 举报
项目8讲解材料_第1页
第1页 / 共48页
项目8讲解材料_第2页
第2页 / 共48页
项目8讲解材料_第3页
第3页 / 共48页
项目8讲解材料_第4页
第4页 / 共48页
项目8讲解材料_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《项目8讲解材料》由会员分享,可在线阅读,更多相关《项目8讲解材料(48页珍藏版)》请在金锄头文库上搜索。

1、项目8 多线程,Java语言提供了对多线程编程的支持。通过运用多线程技术,可以使编写的Java程序并发执行不同的任务,可以使程序反应更快、交互性更强、执行效率更高。本章的项目案例是一个对“龟兔赛跑”寓言故事模拟的程序。在学习和实践了该案例后,应该理解线程的概念以及如何在Java中开发多线程程序。,下一页,项目8 多线程,8.1 项目概述 8.2 项目目的 8.3 项目支撑知识 8.4 项目实施 8.5 项目总结 8.6 扩展演练,8.1 项目概述,本项目为一个对“龟兔赛跑”寓言故事模拟的程序,它用到了多线程技术及GUI的一些编程知识。,返回,8.2 项目目的,理解Java多线程的概念。 掌握创

2、建和控制线程的方法。 .了解线程的同步方法。 .使用线程开发并发程序。,返回,8.3 项目支撑知识,线程是比进程更小的执行单位,是指进程中的一个能够独立运行的执行流程,有时也称为执行情景。所谓多线程是指一个进程在执行过程中可以产生多个线程,这些线程可以同时存在、同时运行,形成多条执行流程。一个进程可能容纳了多个并发执行的线程,它们分别执行不同的任务。同一进程中的所有线程在同一块内存地址空间中工作,可以共享同一块内存。当进程内的多个线程同时运行,这种运行方式称为并发运行。进程和线程一样,都是实现并发性的一个基本单位。,上一页,下一页,返回,8.3 项目支撑知识,在Java虚拟机进程中,执行程序代

3、码的任务是由线程来完成的。每当用Java命令启动一个Java虚拟机进程时,Java虚拟机都会创建一个主线程,该线程从程序入口main()方法开始执行。另外,用户还可以创建自己的线程,它将和主线程并发运行。 我们前面编写的程序都是单线程的,即一个程序只有一个执行流程。而在实际应用中,一个程序往往要并发处理多个任务。如果同一时刻只能单任务操作,效率会非常低。例如在实际网络应用中,一个服务器程序同一时间不可能只对一个用户服务。一个优秀的网络服务程序必须能够同时响应多个用户请求,实现并发服务。,上一页,下一页,返回,8.3 项目支撑知识,多线程是实现并发机制的一种有效手段,其应用范围很广。在一般情况下

4、,程序的一些部分同特定的事件或资源联系在一起,同时又不想为它而暂停程序其他部分的执行,这种情况下,就可以考虑创建一个线程,令它与那个事件或资源关联到一起,并让它独立于主程序运行。通过使用线程,可以避免用户在运行程序和得到结果之间的停顿,还可以让一些任务(如打印任务)在后台运行,而用户则在前台继续执行一些其他的工作。总之,利用多线程技术,可以使编程人员方便地开发出能同时处理多个任务的功能强大的应用程序。,上一页,下一页,返回,8.3 项目支撑知识,2.与线程有关的类 (1)Thread类。 Thread类是多线程中非常重要的一个类,Thread类代表Java程序中单个的运行线程,它综合了Java

5、程序中一个线程需要拥有的属性和方法。 构造方法。 public Thread() 功能:创建一个系统线程类的对象。 public Thread(Runnable target) 参数说明:target是Runnable系统接口的实例对象。,上一页,下一页,返回,8.3 项目支撑知识,功能:创建一个系统线程类的对象,该线程可以调用指定Runnable接口对象的run()方法。 public Thread(Thread Group group,String name) 参数说明:group是ThreadGroup(线程组)的实例对象,name是新线程名字,可以用null作线程名。 功能:创建一个指

6、定名字的系统线程类的对象,并将该线程加入到指定的线程组中。 public Thread(String name) 功能:创建一个指定名字的系统线程类的对象。,上一页,下一页,返回,8.3 项目支撑知识,public Thread(ThreadGroup group,Runnable target) 功能:创建一个系统线程类的对象,并将该线程加人到指定的线程组中,同时该线程可以调用指定Runnable接口对象的run()方法。 public Thread(ThreadGroup group,Runnable target,String name) 功能:创建一个指定名字的系统线程类的对象,并将该

7、线程加人到指定的线程组中,同时该线程可以调用指定Runnable接口对象的run()方法。,上一页,下一页,返回,8.3 项目支撑知识,利用构造方法创建新对象之后,这个对象中的有关数据被初始化,从而进入线程的新建状态。 线程优先级。 Java虚拟机允许一个应用程序拥有多个正在执行的线程。在众多的线程中,哪一个线程先执行,哪一个线程后执行,取决于线程的优先级。线程的优先级是个整数值,值愈高,愈先执行,值愈低,愈慢执行。在Thread类中有三个有关线程优先级的静态常量。,上一页,下一页,返回,8.3 项目支撑知识,MAX PRIORITY:线程拥有最大优先级,值为100。 MIN PRIORITY

8、:线程拥有最小优先级,值为1. NORM PRIORITY:标准的优先级,它为一般线程的默认级,值为5。 Thread类的方法。 利用Thread类定义的方法可以创建线程、控制线程等。Thread类中常用的方法见表8-1所示。,上一页,下一页,返回,8.3 项目支撑知识,(2)ThreadGroup类。 线程组类ThreadGroup常用于管理一组线程,每一个线程可以是某些线程组的一个成员。线程组中还可以包含其他的线程组。 构造方法。 ThreadGroup(String name) 功能:创建一个新线程组,name是新线程组的名字。 ThreadGroup(ThreadGroup paren

9、t,String name),上一页,下一页,返回,8.3 项目支撑知识,功能:创建一个线程组对象,并将该线程组加入到指定的父线程组中。其中name是新线程组的名字,parent是父线程组,即该新线程组是父线程组parent的子组。 ThreadGroup类的主要方法。 线程组中的操作与线程Thread中的操作基本相同,唯一不同的就是线程组的操作是针对该线程组中的所有线程对象。 3.线程的生命周期,上一页,下一页,返回,8.3 项目支撑知识,每个Java程序都有一个默认的主线程,对于Java应用程序,主线程是main()方法执行的线索;对于Applet程序,主线程是指挥浏览器加载并执行Java

10、 Applet程序的线索。要想实现多线程,必须在主线程中创建新的线程对象。线程的状态表示线程正在进行的活动以及在此时间段内所能完成的任务,线程一般具有5种状态,即新建、就绪、运行、堵塞、终止,称其为线程的一个生命周期。其状态转换关系如图8-1所示。,上一页,下一页,返回,8.3 项目支撑知识,(1)新建状态。 在程序中用构造方法创建了一个线程对象后,新生的线程对象便处于新建状态,此时,它已经有了相应的内存空间和其他资源,但还处于不可运行状态。新建一个线程对象可采用线程构造方法。例如: (2)就绪状态。 新建线程对象后,调用该线程的start()方法就可以启动线程。当线程启动时,线程进入就绪状态

11、,并且进入线程就绪队列排队,等待CPU服务,这表明它已经具备入运行条件。,上一页,下一页,返回,8.3 项目支撑知识,(3)运行状态。 当就绪状态的线程被调用并获得处理器资源时,线程进入运行状态。此时,自动调用该线程对象的run()方法。run()方法定义了该线程的操作和功能。 (4)堵塞状态。 一个正在执行的线程在某些特殊情况下,如被人为挂起或需要执行耗时的输入输出操作时,将让出CPU并暂时中止自己的执行,进入堵塞状态。在可执行状态下,如果调用Sleep()、suspend()、wait()等方法,线程都将进入堵塞状态。堵塞时,线程不能进人就绪队列排队,而转人相应的阻塞队列排队,只有当引起堵

12、塞的原因被消除后,线程才可以转入就绪状态。,上一页,下一页,返回,8.3 项目支撑知识,(5)终止状态。 线程调用stop()方法时或run()方法执行结束后,线程即处于终止状态。处于终止状态的线程不具有继续运行的能力。 8.3.2项目开发背景知识2建立线程 在Java中实现一个线程有两种方法,第一是继承Thread类,覆盖它的run()方法,第二种是通过Rnnnable接口实现它的run()方法。 1.通过继承下hread类实现多线程(直接方式),上一页,下一页,返回,8.3 项目支撑知识,创建一个线程,最简单的方法就是从Thread类直接继承。Thread类包含了创建和运行线程所需的一切东

13、西。由于系统的Thread类中,run()方法没有具体内容,所以用户创建自己的Thread类的子类时,需要在子类中重新定义自己的run()方法,这个run()方法中包含了用户线程的操作。定义了Thread子类后,程序中如果需要使用线程时,只需要创建一个已定义好的Thread子类的实例对象就可以了。 直接方式创建线程的步骤如下。,上一页,下一页,返回,8.3 项目支撑知识,(1)定义一个线程(Thread)子类。 (2)在该线程子类中定义run()方法。 (3)在run()方法中定义此线程的具体操作。 (4)在其他类的方法中创建此线程的实例对象,并用start()方法启动线程。 【例8-1】源程

14、序名TestThread.Java,用创建Thread类的子类的方法实现多线程并启动线程。,上一页,下一页,返回,8.3 项目支撑知识,上一页,下一页,返回,8.3 项目支撑知识,上一页,下一页,返回,8.3 项目支撑知识,【运行结果】如图8-2所示。 【程序分析】 第14行:由于线程在休眠时可能被中断,所以调用sleep方法的时候需要捕捉异常。 第26行:创建线程名为Y的ThreadDemo线程对象。 第27行:创建线程名为N的ThreadDemo线程对象。 第28行:启动thread1线程对象。 第29行:启动thread2线程对象。 在本例中,程序执行时便可让两个线程同时工作。由结果可知

15、,两个线程处于无序的同时工作状态,它们的执行顺序并没有一定的规则,其先后次序决定于操作系统的排序原则。,上一页,下一页,返回,8.3 项目支撑知识,2.通过Runnable接口实现多线程(间接方式) 由于Java不支持多继承性,如果用户需要类以线程方式运行且继承其他所需要的类,就必须实现Rnnnable接口。Rnnnable接口包含了与Thread一致的基本方法。事实上,Runnable接口只有一个run()方法,所以实现这个接口的程序必须要定义run()方法的具体内容,用户新建线程的操作也由这个方法来决定。定义好接口类后,程序中如果需要使用线程时,只要以这个实现了run()方法的类为参数创建

16、系统类Thread的对象,就可以把实现的run()方法继承过来。 间接方式创建线程的步骤如下。,上一页,下一页,返回,8.3 项目支撑知识,(1)定义一个Runnable接口类。 (2)在此接口类中定义一个run()方法。 (3)在run()方法中定义线程的操作。 (4)在其他类的方法中创建此Runnable接口类的实例对象,并以此实例对象作为参数创建线程类对象。 (5)用start()方法启动线程。 【例8-2】源程序FlashString.Java,使用Runnable接口方法创建线程和启动线程。,上一页,下一页,返回,8.3 项目支撑知识,上一页,下一页,返回,8.3 项目支撑知识,上一页,下一页,返回,8.3 项目支撑知识,【运行结果】如图8-3所示。 【程序分析】 Runnable接口只定义了一个方法run,通过声明自己的类实现Runnable接口并提供这一方法,将我们的线程代码写入其中,就完成了这一部分的任务。,上一页,下一页,返回,8.3 项目支撑知识,但是Runnable接口并没有任何对线程的支持,还必须创建Thread类的实例,这一点通过Thread类的构造函

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号