JAVA应用22--5.28.ppt_第1页
JAVA应用22--5.28.ppt_第2页
JAVA应用22--5.28.ppt_第3页
JAVA应用22--5.28.ppt_第4页
JAVA应用22--5.28.ppt_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

多线程基础知识钱新杰 1 使用相对URL地址一般要使用getCodeBase和getDocumentBase两个方法 简述其作用 2 简述g drawImage picture x y width height this 各参数的作用 复习提问 线程的基本概念线程的属性线程的优先级 本次课学习目标 我们已经对多任务非常熟悉 Windows和Linux都是多任务的操作系统 这些操作系统可以同时运行两个或两个以上的程序 并且看起来这些程序似乎在同时运行 操作系统负责把系统资源分配给这些运行中的程序 并让人感觉它们是并发活动的 线程的基本概念 实现多任务通常有两种方法 一种称为抢占式多任务 preemptivemultitasking 一种叫合作式多任务 cooperativemultitasking 对于抢占式多任务 操作系统自行决定何时中断一个程序 将执行时间分给其他程序 相反 对于合作式多任务操作系统将与程序进行协商 只有程序自愿放弃控制时才被中断 多线程把操作系统的多任务原理应用到程序中 进一步发展了这一原理 应用了多线程技术的程序如同多任务操作系统一样 可以同时执行多个任务 每个任务被称为一个线程 它是线程控制流的简称 Java语言本身也使用一个线程在后台收集无用的内存单元 这样就减少了用户管理内存的麻烦 通常 把操作系统的多个任务称为进程 Process 而程序中的多任务则称为线程 线程和进程之间有什么区别 最基本的区别就是每个进程都拥有一组完整的属于自己的变量 而线程则共享这些数据 和进程间的通信相比 线程间的通信要快得多 也方便得多 线程一个线程是给定的指令的序列 你所编写的代码 一个栈 在给定的方法中定义的变量 以及一些共享数据 类一级的变量 线程也可以从全局类中访问静态数据 创建线程在Java平台中 创建一个线程非常简单 最直接的方法就是从线程类java lang Thread继承 在缺省情况下 线程类可以被所有的Java应用程序调用 java lang Thread类中定义的五个方法 run 该方法用于线程的执行 你需要重载该方法 以便让线程做特定的工作 start 该方法使得线程启动run 方法 stop 该方法同start 方法的作用相反 用于停止线程的运行 suspend 该方法同stop 方法不同的是 它并不终止未完成的线程 而只是挂起线程 以后还可恢复 resume 该方法重新启动已经挂起的线程 实例 新创建的类重载了run 方法 但实现run 方法不必很严格 因为Thread类可提供一个缺省的run 方法 尽管它不是特别有用 其运行结果如下 ThreadArunningfor2iterationsThreadAsleepingfor913msbetweenloopsThreadA0ThreadBrunningfor12iterationsThreadBsleepingfor575msbetweenloopsThreadB0 ThreadCrunningfor4iterationsThreadCsleepingfor370msbetweenloopsThreadC0ThreadC1ThreadB1ThreadC2ThreadA1ThreadC3ThreadB2ThreadB3 ThreadB4ThreadB5ThreadB6ThreadB7ThreadB8ThreadB9ThreadB10ThreadB11 使用Runnable接口有时 不能重新定义父类 或者不能定义派生的线程类 但也许你的类的层次要求父类为特定的类 然而 Java语言是不支持多父类的 在这些情况下 可以通过Runnable接口来实现多线程的功能 Thread类本身也实现了Runnable接口 一个Runnable接口提供了一个publicvoidrun 方法 实例2 使用Runnable接口 需要实现run 方法 也需要创建Thread对象的一个实例 它最终是用来调用run 方法的 首先 main 方法构造了Test类的一个实例r 实例r有它自己的数据 在这里就是整数i 因为实例r是传给Thread的类构造函数的 所以r的整数i就是线程运行时刻所操作的数据 一个多线程编程环境允许创建基于同一个Runnable实例的多个线程 这可以通过以下方法来做到 Threadt1 newThread r Threadt2 newThread r 此时 这两个线程共享数据和代码 使用Runnable的原因从面向对象的角度来看 Thread类是一个虚拟处理机严格的封装 因此只有当处理机模型修改或扩展时 才应该继承类 由于Java技术只允许单一继承 所以如果你已经继承了Thread 你就不能再继承其他任何类 例如Applet 在某些情况下 这会使你只能采用实现Runnable的方法 线程有四种状态 分别为 new 初始态 一个线程在调用new 方法之后 调用start 方法之前所处的状态 在初始态中 可以调用start 和stop 方法 线程的属性 Runnable 可运行状态 一旦线程调用了start 方法 线程就转到Runnable 状态 注意 如果线程处于Runnable状态 它也有可能不在运行 这是因为还存在优先级和调度问题 blocked 阻塞 挂起状态 线程处于阻塞状态 这是由两种可能性造成的 因挂起而暂停 由于某些原因而阻塞 例如等待IO请求的完成等 dead 终止状态 线程转到退出状态 这有两种可能性 run 方法执行结束 调用了stop 方法 所有可运行线程根据优先级保存在池中 当一个被阻塞的线程变成可运行时 它会被放回相应的可运行池 优先级最高的非空池中的线程会得到处理机时间 被运行 因为Java线程不一定是分时的 所有你必须确保你的代码中的线程会不时地给另外一个线程运行的机会 这可以通过在各种时间间隔中发出sleep 调用来做到 Thread类的另一个方法yield 可以用来使具有相同优先级的线程获得执行的机会 如果具有相同优先级的其他线程是可运行的 yield 将把调用线程放到可运行池中并使另一个线程运行 如果没有相同优先级的可运行进程 yield 什么都不做 sleep 调用会给较低优先级线程一个运行的机会 yield 方法只会给相同优先级线程一个执行的机会 线程的调度线程类提供了四种对线程进行操作的重要方法 sleep join wait 和notify sleep 方法是使线程停止一段时间的方法 在sleep时间间隔期满后 线程不一定立即恢复执行 这是因为在那个时刻 其他线程可能正在运行而且没有被调度为放弃执行 除非 a 醒来 的线程具有更高的优先级 b 正在运行的线程因为其他原因而阻塞 join 方法使得一个线程等待另外一个线程结束后再执行 例如 一个GUI 或者其他线程 使用join 方法等待一个子线程执行完毕 CompleteCalcThreadt newCompleteCalcThread t start 做一会儿其他的事情 然后等待t join 使用计算结果 join 方法有三种格式 voidjoin 等待线程执行完毕 voidjoin longtimeout 最多等待某段时间让线程完成 voidjoin longmilliseconds intnanoseconds 最多等待某段时间 毫秒 纳秒 让线程完成 对于编写线程的程序员来说 还有其他两个有用的方法 即wait 和notify 使用这两个API 可以精确地控制线程的执行过程 关于这两个方法的使用 将在后面详细解释 线程的优先级线程可以设定优先级 高优先级的线程可以安排在低优先级线程之前完成 一个应用程序可以通过使用线程中的setPriority int 方法来设置线程的优先级大小 Java中 线程的优先级从低到高以整数1 10表示 共分为10级 设置优先级是通过调用线程对象的setPriority 方法来进行的 设置优先级的语句为Threadthreadone newThread 用Thread类的子类创建线程Threadthreadtwo newThread threadone setPriority 6

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论