Java程序设计项目化教程 教学课件 ppt 作者 陈芸_ 第11章

上传人:E**** 文档编号:89347345 上传时间:2019-05-23 格式:PPT 页数:71 大小:1.58MB
返回 下载 相关 举报
Java程序设计项目化教程 教学课件 ppt 作者 陈芸_ 第11章_第1页
第1页 / 共71页
Java程序设计项目化教程 教学课件 ppt 作者 陈芸_ 第11章_第2页
第2页 / 共71页
Java程序设计项目化教程 教学课件 ppt 作者 陈芸_ 第11章_第3页
第3页 / 共71页
Java程序设计项目化教程 教学课件 ppt 作者 陈芸_ 第11章_第4页
第4页 / 共71页
Java程序设计项目化教程 教学课件 ppt 作者 陈芸_ 第11章_第5页
第5页 / 共71页
点击查看更多>>
资源描述

《Java程序设计项目化教程 教学课件 ppt 作者 陈芸_ 第11章》由会员分享,可在线阅读,更多相关《Java程序设计项目化教程 教学课件 ppt 作者 陈芸_ 第11章(71页珍藏版)》请在金锄头文库上搜索。

1、第11章 任务11设计考试系统中的倒计时,11.1 任务描述 11.2 技术概览 11.3 任务实施,11.1 任 务 描 述 本章的任务是设计倒计时。考试系统中的倒计时功能是必不可少的功能之一,当考生成功登录考试系统后,点击【开始考试】按钮,则计时系统开始倒计时。当考试时间结束时,系统将弹出相应的对话框提示并退出考试。如图11-1所示,在我们所设计的考试系统中,时间的显示在整个界面的上方,使得考生能清晰地看到时间的显示,把握好考试时间。Java利用线程技术可以实现时间的动态刷新和显示,从而可以实现时间的同步显示。,图11-1 倒计时运行效果,11.2 技 术 要 点 本章的技术要点是多线程技

2、术。在传统的程序设计中,程序运行的顺序总是按照事先编制好的流程来执行的,遇到if-else语句就加以判断;遇到for、while语句若满足循环条件就重复执行相关语句。这种进程(程序)内部的一个顺序控制流称为“线程”。到目前为止,我们所编写的程序都是单线程运行的,也即在任意给定的时刻,只有一个单独的语句在 执行。,多线程机制下则可以同时运行多个程序块,相当于并行执行程序代码,使程序运行的效率变得更高。事实上,真正意义上的并行处理是在多处理器的前提下,同一时刻执行多种任务。在单处理器的情况下,多线程通过CPU时间片轮转来进行调度和资源分配,使得单个程序可以同时运行多个不同的线程,执行不同的任务。由

3、于CPU处理数据的速度极快,操作系统能够在很短的时间内迅速在各线程间切换执行,因此看上去所有线程在同一时刻几乎是同时运行的。多线程执行的方式如图11-2所示。,图11-2 多线程执行方式,多线程是实现并发机制的一种有效手段。进程和线程一样,都是实现并发性的一个基本单位。相对于线程,进程是程序的一次动态执行过程,它对应了从代码加载、执行以及执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到消亡的过程。每一个进程的内部数据和状态都是完全独立的。基于进程的多任务操作系统能同时运行多个进程(程序),例如在使用Word编辑文档的同时可以播放音乐。 线程和进程的主要差别体现在如下两个方面: (1)

4、 同样作为基本的执行单元,线程的划分比进程小。,(2) 每个进程都有一段专用的内存区域。与此相反,线程却共享内存单元(包括代码和数据),通过共享的内存单元来实现数据交换、实时通信与必要的同步操作。 11.2.1 线程的创建 在Java程序中,线程是以线程对象来表示的,也即在程序中,一个线程对象代表了一个可以执行程序片段的线程。Java中提供了两种创建线程的方法:扩展Thread类或实现Runnable接口来创建线程。其中,Thread类和Runnable接口都定义在包java.lang中。,1扩展Thread类以创建线程 直接定义Thread类的子类,重写其中的run()方法,通过创建该子类的

5、对象就可以创建线程。Thread类中包含了创建线程的构造函数以及控制线程的相关方法,如表11-1所示。,表11-1 Thread类的常用构造函数及方法,创建和执行线程的步骤如下: (1) 创建一个Thread类的子类,该类必须重写Thread类的run()方法。 class 类名称 extends Thread /从Thread类扩展出子类 成员变量; 成员方法; public void run() /重写Thread类的run()方法 线程处理的代码, (2) 创建该子类的对象,即创建一个新的线程。创建线程对象时会自动调用Thread类定义的相关构造函数。 (3) 用构造函数创建新对象之后,

6、这个对象中的有关数据被初始化,从而进入线程的新建状态,直到调用了该对象的start()方法。 (4) 线程对象开始运行,并自动调用相应的run()方法。,例11-1 ThreadDemo1.java 1 class MyThread extends Thread 2 public void run() 3 for(int i=1;i=10;i+) 4 System.out.println(this.getName()+“: “+i); 5 6 7 public class ThreadDemo1 8 public static void main(String args) 9 MyThread

7、 t=new MyThread(); 10 t.start();,11 12 程序运行结果如图11-3所示。,图11-3 ThreadDemo1.java的运行结果,从上例我们可以看到一个简单的定义线程的过程,在此要注意run()方法是在线程启动后自动被系统调用的,如果显式地使用t.run()语句则方法调用将失去线程的功能。其中,Thread-0是默认的线程名,也可以通过setName()为其命名。 从程序及运行结果看,似乎仅存在一个线程。事实上,当Java程序启动时,一个特殊的线程主线程(main thread)自动创建了,它的主要功能是产生其他新的线程,以及完成各种关闭操作。从例11-2中

8、我们可以看到主线程和其他线程共同运行的情况。,例11-2 ThreadDemo2.java 1 class MyThread extends Thread 2 MyThread(String str) 3 super(str); 4 5 public void run() 6 for(int i=1;i=5;i+) 7 System.out.println(this.getName()+“: “+i); 8 9 10 public class ThreadDemo2,11 public static void main(String args) 12 MyThread t1=new MyThr

9、ead(“线程1“); 13 MyThread t2=new MyThread(“线程2“); 14 t1.start(); 15 t2.start(); 16 for(int i=1;i=5;i+) 17 System.out.println(Thread.currentThread ().getName()+“: “+i); 18 19 程序运行结果如图11-4所示。,图11-4 ThreadDemo2.java多次运行产生的不同结果,2实现Runnable接口以创建线程 上述通过扩展Thread类创建线程的方法虽然简单,但是Java不支持多继承,如果当前线程子类还需要继承其他多个类,此时

10、必须实现接口。Java提供了Runnable接口来完成创建线程的操作。在Runnable接口中,只包含一个抽象的run()方法。 public interface Runnable public abstract void run() ,利用Runnable接口创建线程,须首先定义一个实现Runnable接口的类,在该类中必须定义run()方法的实现代码。 class MyRunnable implements Runnable public void run() /新建线程上执行的代码 ,直接创建实现了Runnable接口的类的对象并不能生成线程对象,还必须定义一个Thread对象,通过使用

11、Thread类的构造函数去新建一个线程, 并将实现Runnable接口的类的对象引用,作为参数传递给Thread类的构造函数,最后通过start()方法来启动新建线程。基本步骤如下: MyRunnable r =new MyRunnable(); Thread t= new Thread(r); t.start; 我们将例11-2改写为通过实现Runnable接口来创建线程,代码如例11-3所示。,例11-3 RunnerDemo.java 1 class MyRunner implements Runnable 2 public void run() 3 String s = Thread.

12、currentThread().getName(); 4 for(int i=1;i=10;i+) 5 System.out.println(s + “: “ + i); 6 7 8 public class RunnerDemo 9 public static void main(String args) 10 MyRunner r1=new MyRunner();,11 Thread t1=new Thread(r1,“线程1“); 12 Thread t2=new Thread(r1,“线程2“); 13 t1.start(); 14 t2.start(); 15 for(int i=1

13、;i=10;i+) 16 System.out.println(“main 主线程“+“: “+i); 17 18 ,11.2.2 线程的管理 1线程的状态 线程在它的生命周期中一般具有五种状态,即新建、就绪、运行、堵塞和死亡。线程的状态转换图如图11-5所示。,图11-5 线程的状态转换,1) 新建状态(new Thread) 在程序中用构造函数创建了一个线程对象后,新生的线程对象便处于新建状态。此时,该线程仅仅是一个空的线程对象,系统不为它分配相应资源,并且它还处于不可运行状态。 2) 就绪状态(Runnable) 新建线程对象后,调用该线程的start()方法就可以启动线程。当线程启动时

14、,线程进入就绪状态。此时,线程将进入线程队列排队,等待CPU服务,这表明它已经具备了运行条件。,3) 运行状态(Running) 当就绪状态的线程被调用并获得处理器资源时,线程进入运行状态。此时,自动调用该线程对象的run()方法。run()方法中定义了该线程的操作和功能。,4) 阻塞状态(Blocked) 一个正在执行的线程在某些特殊情况下,放弃CPU而暂时停止运行,如被人为挂起或需要执行费时的输入、输出操作时,将让出CPU并暂时中止自己的执行,进入阻塞状态。在运行状态下,如果调用sleep()、suspend()、wait()等方法,线程将进入阻塞状态。阻塞状态中的线程,Java虚拟机不会

15、为其分配CPU,直到引起堵塞的原因被消除后,线程才可以转入就绪状态,从而有机会转到运行状态。,5) 死亡状态(Dead) 线程调用stop()方法时或run()方法执行结束后,线程即处于死亡状态,结束了生命周期。处于死亡状态的线程不具有继续运行的能力。,2线程的优先级 在多线程的执行状态下,我们并不希望按照系统随机分配时间片方式给一个线程分配时间。因为随机性将导致程序运行结果的随机性。因此,在Java中提供了一个线程调度器来监控程序中启动后进入可运行状态的所有线程。线程调度器按照线程的优先级决定调度哪些线程来执行,具有高优先级的线程会在较低优先级的线程之前得到执行。同时,线程的调度是抢先式的,即如果当前线程在执行过程中,一个具有更高优先级的线程进入可执行状态,则该高优先级的线程会被立即调度执行。在Java中,线程的优先级是用整数表示的,取值范围是110。,Thread类中与优先级相关的三个静态常量如下: 低优先级:Thread.MIN_PRIORITY,取值为1。 缺省优先级:Thread. NORM_PRIORITY,取值为5。 高优先级:Thread.MAX_PRIORITY,取值为10。 线程被创建后,其缺省的优先级是缺省优先级Thread. NORM_PRIORITY。可以用方法 int getPriority(

展开阅读全文
相关资源
相关搜索

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

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