java视频教程多线程程序设计.ppt

上传人:max****ui 文档编号:8621150 上传时间:2020-03-30 格式:PPT 页数:27 大小:337.50KB
返回 下载 相关 举报
java视频教程多线程程序设计.ppt_第1页
第1页 / 共27页
java视频教程多线程程序设计.ppt_第2页
第2页 / 共27页
java视频教程多线程程序设计.ppt_第3页
第3页 / 共27页
点击查看更多>>
资源描述
1 第22讲多线程程序设计 线程的概念线程的创建线程调度与线程控制线程状态与生命周期 多线程与并发编程 把一个问题切割分成多个可独立运行的部分 从而提高程序的相应能力 在程序中 这些彼此独立运行的部分称之为线程 thread 线程共享存储空间JVM允许应用程序并发执行多个线程 2 3 程序与进程 程序是指令的集合 包括对数据的描述以及对数据的操作 告诉计算机如何完成一个任务 进程进程通常被认为是一个程序的一次动态执行过程 一个进程具有一组完整的 私有的基本运行时资源 特别是内存空间是独立的 不会与其他进程共享 4 线程 线程是进程中的一个执行流 一组程序指令的顺序流 线程是处理器的调度单位 一个进程包含一个或多个线程 它们共享该进程的资源 如 内存和打开的文件等 程序的执行从一个线程开始 这个线程称为主线程 JAVA可以实现一个进程中多线程的 并发 执行 从而使一个进程 同时 执行多个任务 在多处理器 或多核 系统中 这种并发是真实的 在单处理器系统中 这种并发是通过线程的交替执行来模拟的 线程的状态 新建 new就绪 runnable运行 running阻塞 locking睡眠 sleeping等待 waiting中止 dead 6 线程状态及其变迁 终止 就绪 可运行 运行 睡眠 拥塞 等待 timeover sleep stop wait timeover Lackofsource ready attemper 创建可执行线程 创建java lang Thread类的子类重写Thread父类的run 方法通过子类的实例化 调用start 方法执行线程创建java lang Runnable接口的实现类实现类必须实现run 方法用实现类的实例作为参数 调用Thread类的构造器再通过调用Thread类的start 方法创建并运行线程 7 8 Java线程类Java lang Thread Thread类的实例就是线程 用户通过编写Thread的子类来构造自己的线程 publicUserThreadextendsThread publicvoidrun overriderun方法 9 通过编写Thread的子类创建线程示例 ClassXyzextendsThread inti 线程的数据定义publicvoidrun 线程的代码定义 覆盖run方法 while true System out println Hello i if i 5 break publicclassThreadTest publicstaticvoidmain Stringargs Threadt newXyz 直接实例化Thread的子类Xyz创建线程t start 启动线程 10 Java线程接口java lang Runnable Runnable的定义 publicinterfaceRunnable voidrun 该接口只定义了一个run 方法 定义一个类实现Runnable接口 publicUserRunimplementsRunnable publicvoidrun implementrun方法 11 通过实现Runnable接口创建线程 定义一个类实现Runnable接口 classUserRunimplementsRunnable将该类的实例作为参数传给Thread类的构造方法 从而创建一个线程对象 并通过该对象调用start方法启动线程执行 Runnablerunner newnewUserRun Threadt newThread runner t start 12 通过实现Runnable接口线程创建示例 ClassXyzimplementsRunnable inti 线程的数据定义publicvoidrun 线程的代码定义 实现run方法 while true System out println Hello i if i 5 break publicclassThreadTest publicstaticvoidmain Stringargs Xyzr newXyz 线程体对象Threadt newThread r 以线程体对象为参数创建线程t start 启动线程 13 线程的创建 一个线程是Thread或其子类的对象 Thread的构造方法如下 publicThread publicThread Stringname publicThread Runnabletarget publicThread Runnabletarget Stringname publicThread ThreadGroupgroup Stringname publicThread ThreadGroupgroup Runnabletarget publicThread ThreadGroupgroup Runnabletarget Stringname 14 两种线程创建方法的比较 由于Java的单继承性 继承Thread类的子类无法同时继承其他类 而实现Runnable的接口不影响继续继承其他类 继承Thread类实现的多线程 无法实现多个线程操纵同一个对象 实现Runnable接口的多线程 可以实现多个线程访问同一个对象 15 Thread类的常用方法 voidinterrupt staticbooleaninterrupted voidjoin voidsetDaemon booleanon voidsetName Stringname voidsetPriority intnewPriority staticvoidsleep longmillis voidstart StringtoString staticvoidyield 16 线程的启动 新创建的线程不会自动运行 通过start 方法启动线程 start 方法把线程置为可运行 Runnable 状态 使得该线程可以参与调度 被Java虚拟机 JVM 运行 注意 启动线程并不意味着该线程会立即执行 什么时候执行依赖于JVM的调度 run 方法与start 方法的区别调用start 方法是启动一个新的线程 该线程将参与线程调度 当线程被调度执行时 会运行run 方法 而直接调用run 方法 只是将其作为普通方法执行 并非开启一个新的线程 达不到多线程并发运行的目的 注意 一个线程对象的start 方法只能执行一次 线程的调度 选择线程执行的过程就叫做线程调度 JVM进行线程调度时采用抢先式调度算法 由优先级决定线程执行的优先权所有可运行线程按优先级保存在缓冲池中 线程的优先级越高 其被执行的概率越大 共有十个优先级 每个优先级有一个等待池 JVM先运行高优先级池中的线程 待该池空后才考虑低优先级线程 一个时刻只能一个线程在运行 17 18 线程调度策略详解 优先级相同的线程有分时与独占两种调度方式 在独占模式下 由JVM选定线程执行 直到其运行到不再可运行 或另一个更高优先级的线程抢在到JVM 成为可运行线程 该线程才不再运行 在分时模式下 同一优先级的等待池中的线程轮流运行 每隔一定的时间 让出JVM的使用权 线程一般可用sleep 方法保证给其他线程让出运行时间 线程的调度 休眠 休眠 sleep 使当前线程停止执行一段时间线程的状态由Running sleepsleep方法 staticvoidsleep longmillis 作用 暂停当前执行的线程参数为停止的毫秒数方法可能抛出InterruptedException异常注意 不处于运行状态的线程不能被暂停执行指定的时间结束后 线程将进入可运行状态 不一定能马上恢复执行 19 20 多线程并发执行举例 classTestMultiThreads publicstaticvoidmain String args Threadt1 newThread newT1 1 Threadt2 newThread newT1 2 t1 start t2 start System out println main方法结束 classT1implementsRunnable privateintid publicT1 intid this id id publicvoidrun while true System out println IamThread id try Thread sleep int Math random 2000 catch InterruptedExceptione 线程的调度 优先级 优先权 priority 用于描述线程的重要性每个线程具有优先级 从低到高分为1 10共10个级别 默认的优先级为5 Thread类中定义了三个优先级常量 Thread MIN PRIORITY 1Thread MAX PRIORITY 10Thread NORM PRIORITY 5与优先级有关的方法intgetPriority 获取线程优先级voidsetPrioroty intnewPriority 设置线程优先级 21 优先级 join 加入到某个线程如果某个线程t1 在另一个线程t2上调用join方法 t1 join 则t2将被挂起 直到目标线程t1执行结束才恢复t2的执行 runnable状态 publicfinalvoidjoin publicfinalvoidjoin longmillis publicfinalvoidjoin longmillis intnanos 后者只等指定的时间 可能抛出InterruptedException异常 22 23 线程中断 Interrupt 中断线程 并设置中断标志 相关方法 voidinterrupt 使得线程提前结束执行 会产生InterruptedException异常 booleaninterrupted 测试当前线程是否被中断 如果是则返回true 并清除中断标志 24 后台 daemon 线程 线程可以分为后台线程和用户线程 如果一个程序只有后台线程在运行 则程序会立即退出 如果有用户线程在运行 则程序不会终止 后台线程通常用于为其他线程提供服务 线程默认为用户线程 在线程启动之前 可以用setDaemon方法将线程设置为后台线程 publicfinalvoidsetDaemon booleanon 25 线程组 线程组是将线程进行分组管理的一种方法 一个线程组可以是一些线程和线程组的集合 每个Java线程都归属于一个线程组 线程组由java lang中的ThreadGroup类实现 线程属于某个线程组具有永久性 不允许改变 缺省线程组在JavaApplication启动时 运行系统创建缺省的线程组 称为main 所有未指定组的线程 均属于该组 未指定组的线程 将属于其 父线程 所在线程组 26 创建线程组 通过ThreadGroup类的构造方法可以创建线程组 publicThreadGroup StringgroupName publicThreadGroup ThreadGroupparentGroup StringgroupName 27 指定线程所属的线程组 通过线程的构造方法创建属于某个线程组的线程publicThread ThreadGroupgroup Stringname publicThread ThreadGroupgroup Runnabletarget publicThread ThreadGroupgroup Runnabletarget Stringname 例 查看线程所属的线程组
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!