《Java多线程机制》PPT课件.ppt_第1页
《Java多线程机制》PPT课件.ppt_第2页
《Java多线程机制》PPT课件.ppt_第3页
《Java多线程机制》PPT课件.ppt_第4页
《Java多线程机制》PPT课件.ppt_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、第13章 Java多线程机制,本章要点: 进程与线程 线程的状态 多线程的实现方法 通过继承Thread类实现多线程 通过Runnable接口实现多线程 线程的调度 线程的同步实现,13.1 Java中的线程,计算机的发展日新月异,个人计算机上的操作系统也纷纷采用多任务和分时设计,将早期只有大型计算机才具有的系统特性带到了个人计算机系统中。一般可以在同一时间内执行多个程序的操作系统都有进程的概念。一个进程就是一个执行中的程序,而每一个进程都有自己独立的一块内存空间、一组系统资源。在进程概念中,每一个进程的内部数据和状态都是完全独立的。Java程序通过流控制来执行程序流,程序中单个顺序的流控制称

2、为线程,多线程则指的是在单个程序中可以同时运行多个不同的线程,执行不同的任务。多线程意味着一个程序的多行语句可以看上去几乎在同一时间内同时运行。,13.1.1 进程与线程 进程是程序的一次动态执行过程,它对应了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程。如果把公司一天的工作比作一个进程,那么早上公司开门上班是进程的开始,晚上下班关门是进程的结束。 线程是比进程更小的执行单位。一个进程在其执行过程中,可以产生多个线程,形成多条执行线索,每条线索,即每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的概念。就像公司一天的工作开始后,可以有多个不同的

3、“线程”进行运作,如财务部门、开发部门、销售部门等。我们知道,每个进程都有一段专用的内存区域,与此不同的是,线程间可以共享相同的内存单元(包括代码与数据),并利用这些共享单元来实现数据交换、实时通信与必要的同步操作。比如在公司一天的工作开始后,财务部门、开发部门和销售部门这3个线程可以共享公司的内部网络资源,财务部门、销售部门可以共享公司的账目数据等。多线程的程序能更好地表达和解决现实世界的具体问题,是计算机应用开发和程序设计的一个必然发展趋势。,13.1.2 线程的状态 一个线程在任何时候都处于某种线程状态。线程的几个主要状态有创建、运行、中断和死亡4 种状态。 1. 创建(New Thre

4、ad) Java的线程是通过java.lang.Thread类来实现的。当我们生成一个Thread类的对象之后,一个新的线程就产生了。执行下列语句时,线程就处于创建状态: Thread myThread = new MyThreadClass(); 当一个线程处于创建状态时,它仅仅是一个空的线程对象,系统不为它分配资源。,2. 运行(Runnable) 线程创建之后就具备了运行的条件,一旦轮到它来享用CPU 资源时,就可以脱离创建它的主线程独立开始自己的生命周期了。执行下列语句时,线程就处于运行状态: Thread myThread = new MyThreadClass(); myThrea

5、d.start(); 当一个线程处于可运行状态时,系统为这个线程分配了它所需的系统资源,安排其运行并调用线程运行方法,这样就使得该线程处于可运行(Runnable)状态。需要注意的是这一状态并不是运行中状态(Running),因为线程也许实际上并未真正运行。由于很多计算机都是单处理器的,所以要在同一时刻运行所有的处于可运行状态的线程是不可能的,Java的运行系统必须实现调度来保证这些线程共享处理器。,3. 中断(Not Runnable) 一个正在执行的线程可能被人为地中断,使其让出CPU的使用权,暂时中止自己的执行,进入阻塞状态。阻塞时它不能进入排队队列,只有当引起阻塞的原因被消除时,线程才

6、可以转入就绪状态,重新进到线程队列中排队等待CPU资源,以便从原来终止处开始继续运行。进入中断状态的原因有如下几条: (1)调用了sleep() 方法; (2)调用了suspend() 方法; (3)为等候一个条件变量,线程调用wait() 方法; (4)输入输出流中发生线程阻塞。 4. 死亡(Dead) 处于死亡状态的线程不具有继续运行的能力。线程死亡的原因有两个,一个是正常运行的线程完成了它的全部工作,另一个是线程被提前强制性地终止。所谓死亡状态就是线程释放了实体,即释放分配给线程对象的内存。,线程的状态,13.1.3 多线程的实现方法 在Java中,创建线程的方法有两种:一种方法是通过创

7、建Thread类的子类来实现,另一种方法是通过实现Runnable接口的类来实现,具体如下。 方法一:定义一个线程类,它继承线程类Thread并重写其中的方法run() ,这时在初始化这个类的实例时,目标target可为null,表示由这个实例来执行线程体。由于Java只支持单重继承,用这种方法定义的类不能再继承其他父类。 方法二:提供一个实现接口Runnable的类作为一个线程的目标对象,在初始化一个Thread类或者Thread子类的线程对象时,把目标对象传递给这个线程实例,由该目标对象提供线程体run() 。这时,实现接口Runnable的类仍然可以继承其他父类。,13.2 通过继承Th

8、read类实现多线程,例13-1程序清单 TwoThreads_Test.java public class TwoThreads_Test public static void main(String args) new Thread_Test(线程1).start();/ 第一个线程的名字为线程1 new Thread_Test(线程2).start();/ 第二个线程的名字为线程2 class Thread_Test extends Thread public Thread_Test(String str) super(str); / 调用其父类的构造方法 public void run

9、() / 重写run方法 for (int i = 0; i 10; i+) / 打印次数和线程的名字 System.out.println(i + + getName(); try / 线程睡眠,把控制权交出去 sleep(int)(Math.random() * 1000); catch (InterruptedException e) / 线程执行结束 System.out.println(执行结束! + getName(); ,13.3 通过Runnable接口实现多线程,通过Runnable接口实现多线程的方法是首先设计一个实现Runnable接口的类,然后根据工作需要重新设计线程的

10、run方法;再建立该类的对象,以此对象为参数建立Thread类的对象;调用Thread类对象的start方法启动线程,将执行权转交到run方法。,例13-2程序清单 Runnable_Test.java import java.applet.Applet; import java.awt.Graphics; import java.util.Date; public class Runnable_Test extends Applet implements Runnable / 实现接口 Thread thread; public void start() if (thread = null)

11、 /线程体是Clock对象本身,线程名字为Clock thread = new Thread(this, 小时钟); thread.start(); / 启动线程 public void run() / run()方法中是线程执行的内容 while (thread != null) ,repaint(); / 刷新显示画面 try thread.sleep(1000); / 睡眠1秒,即每隔1秒执行一次 catch (InterruptedException e) public void paint(Graphics g) Date now = new Date(); / 获得当前的时间对象

12、g.drawString(now.getHours() + : + now.getMinutes() + : + now.getSeconds(), 5, 10);/ 显示当前时间 public void stop() thread.stop(); thread = null; ,13.4 线程的调度,Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程。线程调度器按照线程的优先级决定应调度哪些线程来执行。 正如我们前面所讲的:处于就绪状态的线程首先进入就绪队列排队等候处理器资源,同一时刻在就绪队列中的线程可能有多个。多线程系统会给每个线程自动分配一个线程的优先级,任务较紧急的重

13、要线程,其优先级就较高;相反则较低。在线程排队时,优先级高的线程可以排在较前的位置,这样能优先享用到处理器资源,而优先级较低的线程则只能等到排在它前面的高优先级线程执行完毕之后才能获得处理器资源。对于优先级相同的线程,则遵循队列的“先进先出”的原则,即先进入就绪状态排队的线程被优先分配到处理器资源,随后才为后进入队列的线程服务。 当一个在就绪队列中排队的线程被分配到处理器资源而进入运行状态之后,这个线程就称为是被“调度”或被线程调度管理器选中了。线程调度管理器负责管理线程排队和处理器在线程间的分配,一般都配有一个精心设计的线程调度算法。在Java系统中,线程调度依据优先级基础上的“先到先服务”

14、原则。,下面几种情况下,当前线程会放弃CPU: 线程调用了yield() 或sleep() 方法主动放弃; 抢先式系统下,由高优先级的线程参与调度;时间片方式下,当前时间片用完,由同优先级的线程参与调度; 由于当前线程进行I/O访问,外存读写,等待用户输入等操作,导致线程阻塞;或者是为等候一个条件变量,以及线程调用wait() 方法。 Thread 类的setPriority(int a)方法可以设置线程优先级,使之符合程序的特定需要。a 取值是:Thread.MIN_PRIORITY、Thread.MAX_PRIORITY、Thread.NORM_PRIORITY。线程的默认级别是Threa

15、d.NORM_PRIORITY。,例13-3程序清单 ThreadPriority_Test.java class ThreadPriority_Test public static void main(String args) Thread thread1 = new MyThread(Thread1); thread1.setPriority(Thread.MIN_PRIORITY); / 设置优先级为最小 thread1.start(); Thread thread2 = new MyThread(Thread2); thread2.setPriority(Thread.MAX_PRIO

16、RITY); / 设置优先级为最大 thread2.start(); Thread thread3 = new MyThread(Thread3); thread3.setPriority(Thread.MAX_PRIORITY); / 设置优先级为最大 thread3.start(); class MyThread extends Thread String message; MyThread(String message) this.message = message; public void run() for (int i = 0; i 3; i+) / 获得线程的优先级 System

17、.out.println(message + + getPriority(); ,13.5 线程的同步,13.5.1 基本的线程控制 1. 终止线程 线程终止后,其生命周期结束了,即线程进入死亡状态,终止后的线程不能再被调度执行,以下两种情况,线程将进入终止状态: (1)线程执行完其run() 方法后,会自然终止。 (2)通过调用线程的实例方法stop() 来终止线程。 2. 测试线程状态 可以通过Thread 中的isAlive() 方法来获取线程是否处于活动(Alive)状态;线程由start() 方法启动后,直到其被终止之间的任何时刻,都处于活动状态。,3. 线程的暂停和恢复 有以下几种

18、方法可以暂停一个线程的执行,在适当的时候再恢复其执行。 (1)sleep() 方法 当前线程睡眠(停止执行)若干毫秒,线程由运行中状态进入不可运行状态,停止执行时间到后线程进入可运行状态。 (2)suspend() 和resume() 方法 线程的暂停和恢复,通过调用线程的suspend() 方法使线程暂时由可运行态切换到不可运行态,若此线程想再回到可运行态,必须由其他线程调用resume() 方法来实现。但从JDK1.2开始就不再使用suspend() 和resume() 。 (3)join() 方法 当前线程等待调用该方法的线程结束后,再恢复执行。例如: TimerThread tt=new TimerThread(100); tt.start(); public v

温馨提示

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

评论

0/150

提交评论