Java网络编程原理与JSP Web开发核心技术 教学课件 ppt 作者 马晓敏 肖 明 姜远明 齐永波_ 02第二章Java多线程机制

上传人:E**** 文档编号:89396926 上传时间:2019-05-24 格式:PPT 页数:15 大小:140.50KB
返回 下载 相关 举报
Java网络编程原理与JSP Web开发核心技术 教学课件 ppt 作者 马晓敏 肖 明 姜远明 齐永波_ 02第二章Java多线程机制_第1页
第1页 / 共15页
Java网络编程原理与JSP Web开发核心技术 教学课件 ppt 作者 马晓敏 肖 明 姜远明 齐永波_ 02第二章Java多线程机制_第2页
第2页 / 共15页
Java网络编程原理与JSP Web开发核心技术 教学课件 ppt 作者 马晓敏 肖 明 姜远明 齐永波_ 02第二章Java多线程机制_第3页
第3页 / 共15页
Java网络编程原理与JSP Web开发核心技术 教学课件 ppt 作者 马晓敏 肖 明 姜远明 齐永波_ 02第二章Java多线程机制_第4页
第4页 / 共15页
Java网络编程原理与JSP Web开发核心技术 教学课件 ppt 作者 马晓敏 肖 明 姜远明 齐永波_ 02第二章Java多线程机制_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《Java网络编程原理与JSP Web开发核心技术 教学课件 ppt 作者 马晓敏 肖 明 姜远明 齐永波_ 02第二章Java多线程机制》由会员分享,可在线阅读,更多相关《Java网络编程原理与JSP Web开发核心技术 教学课件 ppt 作者 马晓敏 肖 明 姜远明 齐永波_ 02第二章Java多线程机制(15页珍藏版)》请在金锄头文库上搜索。

1、Java网络编程原理与JSP Web核心开发技术,2,第二章 Java的多线程机制,2.1 Java的线程与多线程概述 2.2 Java中线程类、接口和方法及多线程实现 2.3 线程优先级 2.4 线程的生命周期 2.5 线程池,3,2.1 Java中的线程和多线程概述,进程 (process) 程序的一次执行过程。 包括代码加载、执行,到执行结束的一个完整的动态执行过程。 进程具有一定的生命期,从产生、发展,到死亡的过程。 也包括运行中的程序和程序所使用到的内存、CPU等系统资源。 进程是系统资源分配的基本单位。 一个程序可以对应多个进程(多次执行),但一个进程只能对应一个程序。,4,2.1

2、 Java中的线程和多线程概述,线程 (thread) 指进程内部一个单一顺序的控制流,也被称为轻量进程,即程序执行流的最小单元。 线程是进程的进一步细分,每个线程都有一个唯一的标识符,并行执行不同的任务。因此,它不能脱离进程来自行运行。 线程有自身的的产生、存在和死亡的过程生命周期。 在单个进程中可以有一个或多个线程,同时运行多个线程完成不同的工作,称为多线程。 线程是提高代码响应和性能的有力手段。 线程是系统独立调度和分派的基本单位,自己不拥有系统资源。 同一进程中的多个线程共享该进程中的全部系统资源。 相对而言,线程比进程资源开销小,效率高。,5,2.2 Java中线程类、接口和方法及多

3、线性实现,2.2.1 用Thread类创建多线程 构造函数 public Thread():创建名为 “Thread-”+n的线程对象,其中的 n 为整数。 (2)public Thread(String name):创建名为name的线程。 (3)public Thread(Runnable target):创建名为 “Thread-”+n的线程对象,并以参数target为运行对象。 (4)public Thread(Runnable target,String name):创建名为name的线程,并以参数target为运行对象。,6,2.2 Java中线程类、接口和方法及多线性实现,常用方

4、法 public void start() public void run() public static void sleep(long millis) throws InterruptedException public static void yield() public void interrupt() public final String getName() public Thread.State getState() public final void join() throws InterruptedException public final int getPriority(

5、) public final void setName(String name) public final void setPriority(int newPriority) public final boolean isAlive(),7,2.2 Java中线程类、接口和方法及多线性实现,用Thread类创建多线程应用程序 对Thread类的继承,重载其run()方法。 示例程序 用Runabble接口创建多线程应用程序 Runnable接口 如果一个类必须继承于其他类(如Applet小应用程序必须继承自Applet类),则无法再继承Thread类,这时就要采用接口Runnable来实现多线

6、程操作。 自定义一个类来实现 Runnable 接口的run()方法。 示例程序。,8,2.3 线程优先级,2.3.1 分配线程优先级 优先级 当线程产生时,它继承其父线程的优先级。在需要时可对优先级进行修改。在任何时刻,如果有多个线程等待运行,系统选择优先级最高的可运行线程运行。只有当它停止、自动放弃或由于某种原因成为非运行状态,优先级较低的线程才能运行。如果两个线程具有相同的优先级,它们将被交替地运行。 线程优先级常量 Thread.MAX_PRIORITY:最高的线程规划优先级,值为10。 Thread.MIN_PRIORITY:最低的线程规划优先级,值为1。 Thread.NORM_P

7、RIORITY:中间的线程规划优先级,值为5。 分配线程优先级,9,2.3 线程优先级,2.3.2 设置和获取当前线程优先级 setPriority(int newPriority) 更改线程的优先级。 int getPriority() 返回一个int类型整数,表示当前线程的优先级。,10,2.4 线程生命周期,2.4.1 线程的生命周期 状态及转换图,11,2.4 线程生命周期,2.4.2 线程的等待/通知机制 线程同步机制 Java在使用多线程时,会产生很多不可知的问题。由于线程时间片转换错误的继续执行就会造成程序的错误。 使用线程同步去约束每个线程,让每个线程在执行时都加以控制,当其执

8、行结束后,下一个线程才可以执行。这就是线程同步机制。 生产者消费者问题 通过同步,一个线程可以安全地更改另一个线程即将读取的值。 第二个线程通过等待/通知机制得知共享资源的值得到了修改。 如生产者-消费者 关系:先有生产者生产了产品后,消费者才有可能消费 。 实例程序。,12,2.5 线程池,2.5.1 为什么使用线程池 如果每当一个请求到达就创建一个新线程,开销是相当大的。在实际使用中,每个请求创建新线程的服务器在创建和销毁线程上花费的时间和消耗的系统资源,甚至可能要比花在处理实际的用户请求的时间和资源要多得多。 除了创建和销毁线程的开销之外,活动的线程也需要消耗系统资源。如果在一个JVM里

9、创建太多的线程,可能会导致系统由于过度消耗内存或“切换过度”而导致系统资源不足。 为了防止资源不足,服务器应用程序需要一些方法限制任何给定时刻处理的请求数目,尽可能减少创建和销毁线程的次数,特别是资源耗费比较大的线程的创建和销毁,尽量利用已有对象进行服务,这就是“池化资源”技术产生的原因。运用线程池(Thread Pooling)技术可以提高系统效率。目前服务器端的应用程序大多都采用了“线程池”技术。 减少系统响应时间。,13,2.5 线程池,2.5.2 线程池的开销 使用线程池的代价:构建并启动池中的所有线程,时刻准备操作。池的容量可能会远远大于所需的线程数量。 应谨慎衡量池中线程的用途,将

10、池的容量设置为最佳水平。 线程池不能太小,确保不要出现较高的拒绝率。如果不拒绝任务,而是将它置入等待状态,等待的时间太长,反应灵敏度就会下降。 如果把某项任务分配给可能死锁或消亡的线程,也存在危险。 当一个Web服务器接收到大量短小线程的请求时,使用线程池技术是非常合适的,它可以很大程序地减少线程的创建和销毁次数,提高服务器的工作效率。 如果线程要求的运行时间比较长,此时线程的运行时间比创建时间要长得多,单靠减少创建时间对系统效率的提高不明显,此时就不适合应用线程池技术,需要借助其他技术来提高服务器的服务效率。,14,2.5 线程池,2.5.3 线程池的实现 一个比较简单的线程池至少应包含线程

11、池管理器、工作线程、任务队列、任务接口等部分。 线程池管理器(ThreadPool Manager)的作用是创建、销毁并管理线程池,将工作线程放入线程池中; 工作线程是一个可以循环执行任务的线程,在没有任务时进行等待; 任务队列的作用是提供一种缓冲机制,将没有处理的任务放在任务队列中; 任务接口是每个任务必须实现的接口,主要用来规定任务的入口、任务执行完后的收尾工作、任务的执行状态等,工作线程通过该接口调度任务的执行。 示例程序,15,习题,1什么是多线程?实现多线程有哪两种编程方式? 2设置Java多线程中优先级的目的是什么?一共有几种优先级设置? 3实现同步后,有没有产生线程死锁的可能?如果有,举出示例。 4如果用线程池实现HTTP的服务器应用程序,是不是线程池设置容量越大越好?如果不是,为什么? 5实验题目:用Java的等待/通知机制实现“厨师食者”问题。假设分别有6位厨师和6位食者。厨师做一盘菜的时间为4s,食者吃一盘菜的时间为3s。编程实现这一功能,参考“生产者消费者”问题。,

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

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

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