




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Java的多线程机制,1,JAVA 语言,第11讲 JAVA的多线程机制,2021/4/11,Java的多线程机制,2,序,上一讲回顾 设计JAVA GUI程序的主要流程。 JAVAGUI的事件处理机制。 JAVAGUI常用组件的用法 常用属性、方法、事件,2021/4/11,Java的多线程机制,3,序,示例11-1 未使用多线程技术的记数程序。程序功能要求:当用户单击“Start”按钮时,开始计数,计数过程中单击“Close”按钮时,停止计数并关闭应用程序。,程序代码见Counter .java,2021/4/11,Java的多线程机制,4,学习要点,掌握多线程的概念 掌握创建线程的方法
2、了解线程同步、死锁的概念 掌握多线程在实际编程中的应用方法,2021/4/11,Java的多线程机制,5,11.1 线程与多线程,11.1.1概述 什么是进程? 进程是程序在其数据集合上的运行过程,是资源分配和调度的独立单位。 什么是线程? 线程又称轻型进程,是程序运行的最小单位。 在具有线程的操作系统中,进程是分配资源的最小单位,线程是调度基本单位。,2021/4/11,Java的多线程机制,6,进程与多线程,2021/4/11,Java的多线程机制,7,示例,示例11-2使用线程技术的记数程序。 程序代码见CounterThread .java 。,上述示例间的区别?,2021/4/11,
3、Java的多线程机制,8,线程的调度,调度策略 时间片,1,2,Java的调度方法 同优先级线程组成先进先出队列,使用时间片策略 对高优先级,使用优先调度的抢占式策略,抢占式:高优先级的线程抢占CPU,2021/4/11,Java的多线程机制,9,11.1.2 线程的模型,当Java程序启动时,一个线程立刻运行,该线程通常叫做程序的主线程(main thread)。每个Java程序都有一个隐含的主线程。 主线程的重要性 它是产生其他子线程的线程。 通常它必须最后完成执行,因为它执行各种关闭动作。,2021/4/11,Java的多线程机制,10,尽管主线程在程序启动时自动创建,但它可以由一个Th
4、read对象控制。 示例11-3 ChangeMainThread.java,2021/4/11,Java的多线程机制,11,线程的概念模型,2021/4/11,Java的多线程机制,12,11.1.2 线程的状态,每个线程都是通过某个特定Thread对象的方法run( )来完成其操作的,方法run( )称为线程体。 java线程的状态:创建状态、可运行状态、不可运行状态、死亡状态。,2021/4/11,Java的多线程机制,13,线程的状态及其转换,New,Runnable,Not Runnable,Dead,new Thread,1. 创建状态(new Thread)执行下列语句时,线程就
5、处于创建状态: Thread myThread = new MyThreadClass( );,2021/4/11,Java的多线程机制,14,线程的状态及其转换,New,Runnable,Not Runnable,Dead,new Thread,start,2. 可运行状态( Runnable )Thread myThread = new MyThreadClass( );myThread.start( );,2021/4/11,Java的多线程机制,15,线程的状态及其转换,New,Runnable,Not Runnable,Dead,new Thread,start,sleep、wait
6、、suspend、I/O阻塞,3. 不可运行状态(Not Runnable,也称阻塞状态Blocked )进入不可运行状态的原因有: 调用sleep()、suspend()、wait() 、输入输出流中发生线程阻塞。,sleep结束、notify、resume、IO操作完成,2021/4/11,Java的多线程机制,16,线程的状态及其转换,New,Runnable,Not Runnable,Dead,new Thread,start,sleep、wait、suspend、I/O阻塞,sleep结束、notify、resume、IO操作完成,run方法退出stop方法调用,stop方法调用,y
7、ield,4. 死亡状态(Dead) (1)线程的终止一般可通过两种方法实现:自然撤消(线程执行完)或是被停止(调用stop()方法,已被取消。) (2)isAlive方法:1)当该线程为可运行或被阻塞的线程时,返回true;2)否则,返回false。,2021/4/11,Java的多线程机制,17,11.1.3 守护线程,守护线程(Daemon)具有最低的优线级,用于为系统中的其他对象和线程提供服务。如UNIX中的服务器程序。 相关操作方法: setDaemon()置线程为守护线程,在线程创建前调用 isDaemon()判断一个线程是否为守护线程。 示例11-4 DaemonTest.jav
8、a,2021/4/11,Java的多线程机制,18,11.2 创建线程,Thread类是java.lang包中的一个专门用来创建线程和对线程进行操作的类。 实现多线程的两种编程方法 继承 Thread 类 实现 Runnable 接口,2021/4/11,Java的多线程机制,19,11.2.1 多线程的实现方法,方法1. 声明一个 Thread 类的子类,并覆盖 run() 方法。 class mythread extends Thread public void run( ) /* 覆盖该方法*/ ,2021/4/11,Java的多线程机制,20,生成与运行线程 方法1,2021/4/11
9、,Java的多线程机制,21,建立线程,2021/4/11,Java的多线程机制,22,Easy? Lets try it!,扩展Thread类创建线程 示例11-5:Consumer.java,2021/4/11,Java的多线程机制,23,Thread类主要方法总结,启动线程:start() 有关线程执行的控制: stop()、suspend()、resume() 有关调度控制 Thread.sleep(10); /低优先级的线程也可以获得执行 Thread.yield(); /同优先级的线程可以获得执行 suspend(); /暂停本线程,2021/4/11,Java的多线程机制,24,
10、生成与运行线程 方法2,方法2. 声明一个实现 Runnable 接口的类,并实现 run() 方法。 class mythread implements Runnable public void run( ) /* 实现该方法*/ ,2021/4/11,Java的多线程机制,25,生成与运行线程 方法2,class MyRun implements Runnable public void run() 线程体 MyRun mr = new MyRun(); Thread t1 = new Thread(mr) ; t1.start(); /Thread实例用于线程控制,2021/4/11,J
11、ava的多线程机制,26,Easy? Lets try it!,实现Runnable接口创建线程 示例11-6:MyThread.java,2021/4/11,Java的多线程机制,27,构造线程体的两种方法的比较:,1. 使用Runnable接口1) 可以将CPU,代码和数据分开,形成清晰的模型;2) 还可以从其他类继承;3) 保持程序风格的一致性。 2. 直接继承Thread类1) 不能再从其他类继承;2) 编写简单,可以直接操纵线程,无需使用Thread.currentThread()。,应该用哪一种方法创建线程?,2021/4/11,Java的多线程机制,28,使另一个线程获得运行的三
12、种方法,让处于运行状态的线程调用: Thread.sleep()方法。 Thread.yield()方法。 另一个线程的join()方法。,2021/4/11,Java的多线程机制,29,11.2.3 创建多线程,示例11-7:CounterMultiThread.java,2021/4/11,Java的多线程机制,30,11.3 多线程程序设计,引入多线程的优点与缺点。 当多个线程共享一些数据,引起共享资源的竞争,会导致一些意想不到的错误。 需要解决的问题: 线程的同步(线程之间的配合),互斥(一线程等待另一线程的运行),优先级的设置,以及多线程引起的死锁等。,2021/4/11,Java的
13、多线程机制,31,11.3.1 多线程同时运行,多线程同时运行,即多个线程间没有相互制约关系。 示例11-8 MultiCounterThread.java 不同环境下程序的运行结果可能不同!,2021/4/11,Java的多线程机制,32,11.3.2 多线程优先级调度,Java 中的线程优先级是在 Thread 类中定义的常量 NORM_PRIORITY : 值为 5 MAX_PRIORITY : 值为 10 MIN_PRIORITY : 值为 1 缺省优先级为 NORM_PRIORITY,2021/4/11,Java的多线程机制,33,有关优先级的方法有两个: final void se
14、tPriority(int newp) : 修改线程的当前优先级 final int getPriority() : 返回线程的优先级 示例11-9 PriorityDemo.java,2021/4/11,Java的多线程机制,34,11.3.3 多线程的互斥和同步,有时两个或多个线程可能会试图同时访问一个资源 例如,一个线程可能尝试从一个文件中读取数据,而另一个线程则尝试在同一文件中修改数据 在此情况下,这两个线程所处理的数据会一致吗?怎样确保数据的一致性?,2021/4/11,Java的多线程机制,35,两种方式实现互斥:,1、使用互斥方法 synchronized void method
15、A() 2、使用互斥块 synchronized(object) /要互斥的语句 ,2021/4/11,Java的多线程机制,36,实现synchronized 方法中被调用的线程间通信的方法: wait() 使被调用的线程进入等待状态,直到其他线程调用 notify( ) 方法。 notify()通知同一对象上第1个调用 wait()的线程。 notifyAll()通知调用 wait() 的所有线程,具有最高优先级的线程将先运行。 wait() + notify() + 标志变量:可协调、同步不同线程的工作,2021/4/11,Java的多线程机制,37,线程的同步与互斥,线程间需协调与通讯
16、:生产者/消费者问题,示例11-10:生产者-消费费者问题ProducerConsumerProblem.java,2021/4/11,Java的多线程机制,38,11.3.4 死锁,当一个线程等待由另一个线程持有的锁,而后者正在等待已被第一个线程持有的锁时,就会发生死锁。 Java不监测也不试图避免这种情况。因而保证不发生死锁就成了程序员的责任。 示例11-11: DaemonTest.java,2021/4/11,Java的多线程机制,39,class Operator implements Runnable Operator anotherOperator; synchronized p
17、ublic void methodA() System.out.println(Thread.currentThread().getName()+:begin methodA); tryThread.sleep(200);catch(Exception e) System.out.println(Thread.currentThread().getName()+:call another methodA); anotherOperator.methodA(); System.out.println(Thread.currentThread().getName()+:end methodA);
18、public void run() methodA(); ,2021/4/11,Java的多线程机制,40,死锁,public class DeadLockTest public static void main(String args) Operator o1=new Operator(); Operator o2=new Operator(); o1.anotherOperator=o2; o2.anotherOperator=o1; Thread t1=new Thread(o1); Thread t2=new Thread(o2); t1.start(); t2.start(); ,O
19、perator1,methodA(),t1,Operator2,methodA(),t2,2021/4/11,Java的多线程机制,41,11.4 多线程的控制,线程sleep()的时候并不释放对象的锁,但是wait()的时候却会释放对象的锁。 即在线程wait()期间,别的线程可以调用它的synchronized方法。 当线程调用了某个对象wait()方法之后,它就中止运行并释放那个对象锁了。,2021/4/11,Java的多线程机制,42,11.4.1 判断线程是否结束,方法一:在线程中调用isAlive() ,格式: final boolean isAlive( ) 如果所调用线程仍在运
20、行,isAlive()方法返回true,否则返回false。,2021/4/11,Java的多线程机制,43,方法二:在线程中调用join()更常用的方法是,格式: final void join( ) throws InterruptedException 该方法等待所调用线程结束。 示例11-12 JionDemo.java,2021/4/11,Java的多线程机制,44,11.4.2 线程阻塞,sleep()方法 suspend()和resume()方法 yield()方法 wait()和notify()方法,2021/4/11,Java的多线程机制,45,11.4.3 线程阻塞的处理,suspend()、resume()和stop()方法 示例11-13:Suspend.java,2021/4/11,Java的多线程机制,46,11.5 线程的应用,考虑到多线程编程的复杂性,是否需要多线程?何时需要多线程? 多线程的核心在于多个代码块并发执行,本质特点在于各代码块之间的代码是乱序执行的(即执行的顺序不可预测)。,2021/4/11,Java
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医疗质量年终工作总结
- 2026届四川省德阳市中学江县九年级化学第一学期期末考试试题含解析
- 区药事质控年度工作总结
- 江苏省南京溧水区2026届九上化学期中质量检测试题含解析
- 字节跳动新人培训体系概览
- 北京十二中学2026届九年级化学第一学期期中教学质量检测模拟试题含解析
- 中医刮痧疗法培训
- 学校教师培训成果汇报
- 金孔雀舞动教学
- 2026届甘肃泾川县英语九上期末预测试题含解析
- 软件测试升职述职报告
- 室内装饰测量放线专项方案
- 基于移动互联网的智慧观光巴士服务平台
- 一文了解华为MTL流程和LTC流程z1222
- 医院护理品管圈:提高新生儿喂养后体位摆放执行率
- 弹簧-锥形弹簧的计算
- 肾主生殖理论及肾性不孕
- 【家庭教育的不足对小学生心理健康的影响问题探讨6500字(论文)】
- 青少年软件编程(Scratch)三级考试题库(变量 克隆 画笔)
- 注浆加固技术课件
- 锅炉煮炉方案
评论
0/150
提交评论