- 11
- 0
- 约9.97千字
- 约 32页
- 2017-03-29 发布于四川
- 举报
面向对象编程导论第8章节
面向对象编程导论 授课人:宋东峰 第八章 线程 本讲概要 本讲重点 线程的概念 线程的生命周期 Java中多线程的编程 继承Thread类与使用Runnable接口 Thread类的主要方法 线程的同步与死锁 4.1 线程及相关概念 程序:计算机高级语言编写的代码,静态,是应用程序的蓝本。 进程:是程序的一次动态执行过程,进程包括所要执行的指令和所需的系统资源,不同的进程所占用的系统资源相对独立。 线程:比进程更小的执行单位,自身不能自动运行,必须栖身于某一进程之中,由该进程触发执行,属于同一进程的线程共享该进程的系统资源。 多进程:系统中多个程序同时执行(多任务)。 多线程:程序(进程)中多个片断同时执行。 4.1.1 线程及相关概念 Java程序执行的过程 当JVM加载代码,发现main方法之后,就会启动一个线程,这个线程称作“主线程”,该线程负责执行main方法。 如果main方法中没有创建其他的线程,那么当main方法执行完最后一个语句,JVM就会结束Java应用程序。 如果main方法中创建了其他线程,那么JVM就要保证每个线程都有机会使用CPU资源。 JVM一直要等到主线程中的所有线程都结束之后,才结束Java应用程序。 4.1.2 线程的生命周期 线程的五个生命周期 新建:新建的线程处于新建状态。 就绪:在创建线程后,它将处于就绪状态,排队等待进程调用。 运行:线程获得CPU资源后,就进入运行状态,开始执行。 阻塞:在线程等待一个事件时(例如输入/输出操作),就处于阻塞状态。 死亡:线程不再具有继续运行的能力。 线程完成了自己的任务。 线程被强迫终止。 4.1.2 线程生命周期示意图 4.2 基本编程思路 例: class A implements Runnable{ public void run(){….}// 线程所需要执行的代码 } class B { public static void main(String[] arg){ Runnable a=new A(); Thread t=new Thread(a); t.start(); // main方法所在线程的执行代码 } } 4.2 线程的优先级和调度调度 当一个在就绪队列中排队的线程被分配到处理器资源而进入运行状态之后,这个线程就称为被“调度”或被线程调度管理器选中了。 线程调度管理器负责管理线程排队和处理器在线程之间的分配 在java系统中,线程调度依据优先级基础上的“先到先服务”原则。 4.2.1线程的优先级和调度调度 Java虚拟机(JVM)中的线程调度器负责管理线程,调度器把线程的优先级分为10个级别。 优先级使用Thread类中的类常量表示。 4.2.2 线程的创建 4.2.3 线程的创建 4.3线程的创建 4.3 线程的创建 4.3 线程的创建 需要注意的问题 程序需要建立自己的线程时,只需要创建一个已定义好的Thread子类的实例就行了。 当创建的线程调用start()方法开始运行时,run()方法将被自动执行。 当run()方法执行完毕,线程就释放内存。 在线程没有结束run()方法前,不赞成让线程再调用start()方法,否则将发生IllegalThreadStateException异常 4.3 线程的创建 public static void sleep(long millis) 优先级高的线程在它的run()方法中调用sleep方法来使自己放弃处理器资源,休眠一段时间。 public final boolean isAlive() 检查线程是否仍然在运行。 Static Thread currentThread() 判断当前正在占有CPU的线程。 Join()\守护线程的使用 4.3 实现Runnable接口 4.3 实现Runnable接口 4.3 线程的基本控制 4.3 线程的基本控制 4.4 数据的完整性 4.4 数据的完整性 对共享对象的访问必须同步,叫做条件变量. Java语言允许通过监视器(有的参考书称其为管程)使用条件变量实现线程同步. 监视器阻止两个线程同时访问同一个条件变量.它的如同锁一样作用在数据上. 线程1进入withdrawal方法时,获得监视器(加锁);当线程1的方法执行完毕返回时,释放监视器(开锁),线程2的withdrawal方能进入. 4.4 数据的完整性 用synchronized来标识的区域或方法即为监视器监视的部分。 一个类或一个对象由一个监视器,如果一个程序内有两个方法使用synchronized标志,则他们在一个监视器管理之下. 一般情况下,只在方法的层次上使用关键区 4.4 多线程问题
原创力文档

文档评论(0)