java程序设计电子教案和教学指南第10章类与对象_第1页
java程序设计电子教案和教学指南第10章类与对象_第2页
java程序设计电子教案和教学指南第10章类与对象_第3页
java程序设计电子教案和教学指南第10章类与对象_第4页
java程序设计电子教案和教学指南第10章类与对象_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

1、 10.1 多 线 程 10.1.1 线程的概念 程序内部的指令流 线程线程又被称为“轻负荷进程轻负荷进程”进程: 简单地说,进程就是一个执行中的程序每个进程都有一段专用的存储空间,进程间切换时内存消耗较大,进程间通信速度较慢。 10.1.1 线程的概念 进程: 简单地说,进程就是一个执行中的程序10.1.1 线程的概念 线程和进程一样,也是一个执行中线程和进程一样,也是一个执行中的程序,但相对于进程,线程减少了系的程序,但相对于进程,线程减少了系统不必要的负担统不必要的负担进 程线 程比比 较较共享同一块内存空间共享同一组系统资源每一个进程的内部数据和状态都是相互独立的在各个线程之间进行切换

2、时,负担要比进程小得多。在各个线程之间进行切换时,负担要比进程小得多。10.1.1 线程的概念 即允许同一个程序有多个执行线索 在Java程序中,多个线程之间是互相独立的,程序允许多个线程并发执行。 10.1.2 创建线程 类Thread提供了大量的方法用于控制程序中的各个线程 Java Java提供了线程类提供了线程类ThreadThread来创建线程,来创建线程,线程就是线程就是ThreadThread类或其子类的实例对象。类或其子类的实例对象。 10.1.2 创建线程 Java Java提供了线程类提供了线程类ThreadThread来创建线程,来创建线程,线程就是线程就是ThreadT

3、hread类或其子类的实例对象。类或其子类的实例对象。 Thread 类最重要的方法是类最重要的方法是run(),它为,它为Thread类的方法类的方法start()所调用,作用:提供我们的线程所要所调用,作用:提供我们的线程所要执行的代码。执行的代码。【程序案例10.1】class Lefthand extends Thread public void run()System.out.println(左手把握方向盘,汽车飞奔);继承 Thread 类自定义线程的run()方法 run()方法中加入线程所要执行的代码【程序案例10.1】class Lefthand extends Thread

4、 public void run()System.out.println(左手把握方向盘,汽车飞奔);继承 Thread 类自定义线程的run()方法 方法方法run(),提供我们的线程所要执行的代码。,提供我们的线程所要执行的代码。为了指定我们自己的代码,只需要覆盖它!为了指定我们自己的代码,只需要覆盖它! 【程序案例10.1】class Righthand extends Thread public void run()System.out.println(右手拨打手机,联系业务);继承 Thread 类自定义线程的run()方法(覆盖方法 run())方法方法run(),提供我们的线程所

5、要执行的代码。,提供我们的线程所要执行的代码。class Exa10_1/声明主类public static void main(String args)/声明主方法Lefthand 左手=new Lefthand(); Righthand 右手=new Righthand(); 左手.start(); 右手.start(); 用Thread类的子类创建线程,待命创建线程待命strat()方法启动线程strat()方法启动线程class Exa10_1public static void main(String args)Lefthand 左手=new Lefthand(); Righthan

6、d 右手=new Righthand(); 左手.start(); 右手.start(); 运行该程序,运行该程序,JVM将启动主线程将启动主线程,主主线程负责执行线程负责执行main()方法。方法。 由于在由于在main()方法的执行中又创建了其他线程,方法的执行中又创建了其他线程,那么那么JVM就要在主线程和其他线程之间轮流切换,并就要在主线程和其他线程之间轮流切换,并发执行多个线程,直到程序中的所有线程都结束后,发执行多个线程,直到程序中的所有线程都结束后,才结束程序的运行。才结束程序的运行。class Exa10_1public static void main(String args

7、)Lefthand 左手=new Lefthand(); Righthand 右手=new Righthand(); 左手.start(); 右手.start(); 在该程序中,两个线程在该程序中,两个线程“左手左手”和和“右手右手”被被实际创建后处于待命状态,激活(启动)线程就是实际创建后处于待命状态,激活(启动)线程就是启动线程的启动线程的run()方法,这是通过调用线程的方法,这是通过调用线程的start()方法来实现的。方法来实现的。 当线程“左手”和“右手”被启动后会交替占用CPU,处于并行运行状态。 程序运行结果如图示: 【程序案例程序案例10.2】public class MyT

8、hread extends Thread int count= 1, number; public void run() while(true)System.out.println(线程 + number + :计数 + count);if(+count= 6) return; 继承继承 Thread 类类覆盖方法覆盖方法 run()在在run()中加入线程所要执行的代码中加入线程所要执行的代码public MyThread(int num) number = num; System.out.println(创建线程创建线程 + number); public static void main

9、(String args)for(int i = 0; i5; i+) new MyThread(i+1).start(); 构造方法构造方法 strat()方法启动线程创建线程该程序在该程序在main()方法中创建了多个线程,这些线程通方法中创建了多个线程,这些线程通过调用过调用start()方法启动线程的方法启动线程的run()方法,使方法,使JVM在主在主线程和其他线程之间轮流切换,并发执行多个线程。线程和其他线程之间轮流切换,并发执行多个线程。 程序运行结果如图10.2所示:图10.2 调用调用start()方法方法用于用于启动线程的启动线程的run()方法:方法: 启动线程的启动线程

10、的run()方法后,方法后,start()告诉系统告诉系统“该该线程准备就绪,可以启动线程准备就绪,可以启动run()方法方法”后,就返回后,就返回start()方法方法,并执行调用并执行调用start()方法语句下面的语句。方法语句下面的语句。 注意:注意: 这时这时run()方法可能还在运行,这样,线程的启动方法可能还在运行,这样,线程的启动和程序的继续运行并行进行,实现了多任务操作。和程序的继续运行并行进行,实现了多任务操作。 调用调用start()方法方法用于用于启动线程的启动线程的run()方法:方法: 启动线程的启动线程的run()方法后,方法后,start()告诉系统告诉系统“该

11、该线程准备就绪,可以启动线程准备就绪,可以启动run()方法方法”后,就返回后,就返回start()方法方法,并执行调用并执行调用start()方法语句下面的语句。方法语句下面的语句。 说明:说明: 1、对于一般方法,必须等方法执行完毕才能够对于一般方法,必须等方法执行完毕才能够返回。但调用返回。但调用start()方法则不同于一般的方法调用。方法则不同于一般的方法调用。 调用调用start()方法方法用于用于启动线程的启动线程的run()方法:方法: 启动线程的启动线程的run()方法后,方法后,start()告诉系统告诉系统“该该线程准备就绪,可以启动线程准备就绪,可以启动run()方法方

12、法”后,就返回后,就返回start()方法方法,并执行调用并执行调用start()方法语句下面的语句。方法语句下面的语句。 说明:说明: 2、如果在如果在main()方法中没有创建其他的线程方法中没有创建其他的线程,那那么当么当main()方法执行完最后一个语句返回时,方法执行完最后一个语句返回时,JVM就就会结束程序的运行。会结束程序的运行。10.2 线程的状态与生命周期 一、新建的线程在它的一个完整的生命周期中通常一、新建的线程在它的一个完整的生命周期中通常要经历如下的要经历如下的5种状态种状态:1. 新建状态:新建状态:2. 就绪状态:就绪状态:3. 运行状态:运行状态:4. 中断状态:

13、中断状态:5. 死亡状态:死亡状态: 10.2 线程的状态与生命周期 一、新建的线程在它的一个完整的生命周期中通常一、新建的线程在它的一个完整的生命周期中通常要经历如下的要经历如下的5种状态种状态:线程对象已被创建线程对象已被创建但尚处于待命状态但尚处于待命状态1. 新建状态:新建状态:2. 就绪状态:就绪状态:3. 运行状态:运行状态:4. 中断状态:中断状态:5. 死亡状态:死亡状态: 此时它已经占有了相应的内存此时它已经占有了相应的内存空间和其他资源空间和其他资源只是只是start()尚未被调用尚未被调用10.2 线程的状态与生命周期 一、新建的线程在它的一个完整的生命周期中通常一、新建

14、的线程在它的一个完整的生命周期中通常要经历如下的要经历如下的5种状态种状态:线程调用线程调用start()方法通知方法通知JVM,新线程排队等候切换新线程排队等候切换 1. 新建状态:新建状态:2. 就绪状态:就绪状态:3. 运行状态:运行状态:4. 中断状态:中断状态:5. 死亡状态:死亡状态: 一旦它获得一旦它获得CPU使用权时使用权时线程就可以脱离创建它的主线程线程就可以脱离创建它的主线程独立开始自己的生命周期了独立开始自己的生命周期了 10.2 线程的状态与生命周期 一、新建的线程在它的一个完整的生命周期中通常一、新建的线程在它的一个完整的生命周期中通常要经历如下的要经历如下的5种状态

15、种状态:run()方法自动执行方法自动执行完成线程的具体使命完成线程的具体使命 1. 新建状态:新建状态:2. 就绪状态:就绪状态:3. 运行状态:运行状态:4. 中断状态:中断状态:5. 死亡状态:死亡状态: 当线程拥有当线程拥有CPU的使用权时的使用权时线程开始运行线程开始运行 10.2 线程的状态与生命周期 一、新建的线程在它的一个完整的生命周期中通常一、新建的线程在它的一个完整的生命周期中通常要经历如下的要经历如下的5种状态种状态:若执行某个操作进入阻塞状态若执行某个操作进入阻塞状态则当前线程也将处于中断状态则当前线程也将处于中断状态 1. 新建状态:新建状态:2. 就绪状态:就绪状态

16、:3. 运行状态:运行状态:4. 中断状态:中断状态:5. 死亡状态:死亡状态: 当当JVM将将CPU资源切换给其他线程时资源切换给其他线程时则当前线程会让出则当前线程会让出CPU的使用权处于中断状态的使用权处于中断状态 10.2 线程的状态与生命周期 一、新建的线程在它的一个完整的生命周期中通常一、新建的线程在它的一个完整的生命周期中通常要经历如下的要经历如下的5种状态种状态:若执行某个操作进入阻塞状态若执行某个操作进入阻塞状态则当前线程也将处于中断状态则当前线程也将处于中断状态 1. 新建状态:新建状态:2. 就绪状态:就绪状态:3. 运行状态:运行状态:4. 中断状态:中断状态:5. 死

17、亡状态:死亡状态: 或因线程执行了或因线程执行了wait()、sleep()方法方法也可处于中断状态也可处于中断状态 中断状态时,只有当原因消除后中断状态时,只有当原因消除后线程才重新进入队列中排队等待线程才重新进入队列中排队等待CPU资源资源 10.2 线程的状态与生命周期 一、新建的线程在它的一个完整的生命周期中通常一、新建的线程在它的一个完整的生命周期中通常要经历如下的要经历如下的5种状态种状态:也可以强制调用stop()或destroy()提前终止线程1. 新建状态:新建状态:2. 就绪状态:就绪状态:3. 运行状态:运行状态:4. 中断状态:中断状态:5. 死亡状态:死亡状态: 当执

18、行完当执行完run()方法并返回时方法并返回时线程丧失继续运行的能力线程丧失继续运行的能力处于死亡状态处于死亡状态10.2 线程的状态与生命周期 二、二、 线程的生命周期线程的生命周期 : 线程和进程一样,都存在一个从产生、发展到线程和进程一样,都存在一个从产生、发展到消亡的动态运行过程,它拥有独立的执行控制,由消亡的动态运行过程,它拥有独立的执行控制,由操作系统负责调度。操作系统负责调度。 10.2 线程的状态与生命周期 二、二、 线程的生命周期线程的生命周期 :如图所示:如图所示:新建就绪运行死亡中断10.3 通过实现通过实现 Runnable 接口创建线程接口创建线程 创建多线程的另一个

19、途径是:创建多线程的另一个途径是: 利用接口利用接口 java.lang.Runnable java.lang.Runnable 创建多线程创建多线程但Runnable接口并没有任何对线程的支持10.3 通过实现通过实现 Runnable 接口创建线程接口创建线程 创建多线程的另一个途径是:创建多线程的另一个途径是: 利用接口利用接口 java.lang.Runnable java.lang.Runnable 创建多线程创建多线程注意:注意: 必须直接用必须直接用Thread类创建线程对象,这一类创建线程对象,这一点通过点通过Thread类的构造方法来实现:类的构造方法来实现: public

20、Thread(Runnable target)【程序案例程序案例10.3】public class M implements Runnableint count= 1, number;public M(int num)number = num; System.out.println(创建线程 + number); public void run()while(true)System.out.println(线程 + number + :计数 + count); if(+count= 6) return; 声明自己的类实现接口 RunnableRunnable接口中的方法run() 将我们的线程

21、代码写入run()中 传递一个参数传递一个参数给线程对象给线程对象public static void main(String args)for(int i = 0; i5;i+) new Thread( new M(i+1) ) . start(); 该参数是实现该参数是实现Runnable接口的目标接口的目标对象且包含了对象且包含了run()方法方法public static void main(String args)for(int i = 0; i5;i+) new Thread( new M(i+1) ) . start(); 一旦线程被启动,目标对象将自动调用接口中一旦线程被启动,

22、目标对象将自动调用接口中的的run()方法(接口回调),这一点有点类似回调函方法(接口回调),这一点有点类似回调函数。数。 该参数是实现该参数是实现Runnable接口的目标接口的目标对象且包含了对象且包含了run()方法方法程序运行结果如图所示:【程序案例10.4】class Lefthand extends Thread public void run() System.out.println(左手把握方向盘,汽车飞奔);class Righthand implements Runnable public void run() System.out.println(右手拨打手机,联系业务)

23、;【程序案例10.4】class Lefthand extends Thread public void run() System.out.println(左手把握方向盘,汽车飞奔);class Righthand implements Runnable public void run() System.out.println(右手拨打手机,联系业务);继承 Thread 类自定义线程的run()方法 run()方法中加入线程所要执行的代码【程序案例10.4】class Lefthand extends Thread public void run() System.out.println(左手把握方向盘,汽车飞奔);class Righthand implements Runnable public void run() System.out.println(右手拨打手机,联系业务);声明自己的类实现接口 RunnableRunnable接口中的方法run() 将我们的线程代码写入run()中 class Exa10_4public static void main(String args)Lefthand 左手=new Lefthand(); Thre

温馨提示

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

评论

0/150

提交评论