Java应用程序开发 (16).pptxVIP

  • 1
  • 0
  • 约1.89千字
  • 约 33页
  • 2019-07-17 发布于辽宁
  • 举报
学习情境十六 线程 ?;知识目标 理解Java实现多任务的技术; 理解Java线程知识; 理解利用多线程技术编写反应灵敏的GUI应用程序的原理; 理解多个线程之间的同步的原理。 能力目标 能够正确使用sleep()方法延缓程序的运行速度; 能够正确创建附加线程; 能够正确停止线程; 能够正确设置线程的优先级; 能够正确实现反应灵敏的GUI应用程序。;情景再现与任务分析;五个任务;任务一 认识线程;1.什么是线程;进程和线程的关系如图16-1。;即使只有一个CPU,计算机系统也能同时运行多个进程和多个线程。操作系统把计算机的系统资源(尤其是CPU时间)进行时间上的分割,将整个工作时间分成一个个时间段,每个时间段称为一个时间片,每个线程依次轮流使用一个时间片,若时间片用完,而线程还未结束,则挂起线程,等待下次分得时间片。操作系统中的资源调度程序负责给线??分配时间片。时间片原理如图16-2。 Java语言由java.lang.Thread类处理线程。;;2.线程的生命周期;图16-3描绘了线程的各种状态。;3.利用sleep()方法暂停线程;【例16-1】延时输出信息;任务二 创建并启动线程;1.利用Thread类的子类创建线程;2. 利用Runnable接口创建线程;【例16-2】利用Thread类的子类创建附加线程;附加的线程总是执行重载的run()方法。 必须调用线程的start()方法来启动线程,由start()方法自行调用run()方法来执行新线程中设定的动作。 程序中不能直接调用新线程的run()方法。因为线程必须由操作系统拥有和管理。 也可以直接创建Thread类的对象作为附件的线程,例如,new Thread(),但是由于Thread类中的run()方法是空的(没有任何语句),这样的附加线程什么也不能做,所以没有意义。;【例16-3】利用Runnable接口创建附加线程。;任务三 停止一个线程;1.守护线程和用户线程;非守护线程被称为用户线程,它不会随着主线程的停止而停止。 试一下: 如果把例16-3中的线程设置为非守护线程,即注释掉“t.setDaemon(true);”语句,那么子线程不会随主线程停止而停止; 如果保持例16-3中的线程为守护线程,但是把主线程中的延时语句(加黑部分)注释掉,那么主线程会立即结束,子线程也紧跟着结??。这样,子线程不会有任何输出。;2.停止线程;【例16-4】停止子线程;任务四 设置线程的优先级;Thread类中设置和查询线程优先级的方法如下: public final void setPriority(int newPriority) 改变线程的优先级,参数newPriority指定线程的优先级。线程的优先级必须在MAX_PRIORITY与NORM_PRIORITY之间,否则会抛出IllegalArgumentException异常。 public final int getPriority() 返回线程的优先级。;【例16-5】例线程的优先级;任务五 实现能及时作出响应的GUI应用程序;【例16-6】无法控制后台任务的程序;利用多线程技术可以改善例16-6应用程序。我们知道线程之间可以共享变量,因此,应用程序中可以设置一个开关,由它控制后台任务的执行或停止。这个开关被主线程和子线程共享,主线程控制开关的状态,子线程读取开关的状态,进而控制后台任务的执行或停止。;【例16-7】可以控制后台任务的应用程序。程序名为Progress2.java;程序说明: 这个程序的输出界面与例16-6相同,如图16-4所示,但是,它克服了不能及时响应用户操作的缺点。用户点击窗体上的“Start”按钮之后,应用程序开始执行后台任务。此时,用户还可以点击“On/Off”按钮,用它来控制停止或继续执行后台任务,并且用户还可以随时关闭窗体,退出程序。 后台任??是一个消耗CPU资源的操作,由附加线程执行,但是停止或继续执行后台任务的开关由主线程控制。主线程中执行的各种动作都是瞬间完成的,例如,创建执行后台任务的线程并启动之,设置控制后台任务的开关,关闭窗体,等等。 SubTask类是Thread类的子类,用于创建执行后台任务的线程。StartListener类和OnOffListener类是监听器类。它们都定义为Progress2类的内部类,这些内部类可以很方便地访问Progress2类的成员变量与成员方法。 控制执行后台任务开关是runFlag,它很好地体现了线程之间共享变量这一特点。;总结

文档评论(0)

1亿VIP精品文档

相关文档