面向对象的程序设计-Java张白一第三版第13章

上传人:ji****72 文档编号:51489770 上传时间:2018-08-14 格式:PPT 页数:53 大小:1.17MB
返回 下载 相关 举报
面向对象的程序设计-Java张白一第三版第13章_第1页
第1页 / 共53页
面向对象的程序设计-Java张白一第三版第13章_第2页
第2页 / 共53页
面向对象的程序设计-Java张白一第三版第13章_第3页
第3页 / 共53页
面向对象的程序设计-Java张白一第三版第13章_第4页
第4页 / 共53页
面向对象的程序设计-Java张白一第三版第13章_第5页
第5页 / 共53页
点击查看更多>>
资源描述

《面向对象的程序设计-Java张白一第三版第13章》由会员分享,可在线阅读,更多相关《面向对象的程序设计-Java张白一第三版第13章(53页珍藏版)》请在金锄头文库上搜索。

1、第13章 多线程 第13章 多线程 13.1 Java中的多线程实现技术 13.2 多线程的管理 第13章 多线程 13.1 Java中的多线程实现技术多线程机制是Java语言的又一重要特征,使用多线程技术可以使系统同时运行多个执行体,这样就可以加快程序的响应时间,提高计算机资源的使用效率。正确使用多线程技术可提高整个应用系统的性能。第13章 多线程 13.1.1 线程的生命周期每个Java程序都有一个缺省的主线程。对于Application,主线程是main( )方法执行的线索。对于Applet,主线程指挥浏览器加载并执行Java小程序。要想实现多线程,必须在主线程中创建新的线程对象。Jav

2、a语言使用Thread类及其子类的对象来表示线程。新建的线程在它的一个完整的生命周期中通常要经历新生、就 绪、运行、阻塞和死亡等五种状态,这五种状态之间的转换关系和转换条件如图13.1所示。第13章 多线程 图13.1 线程的生命周期 第13章 多线程 1新生状态当用new关键字和某线程类的构造方法创建一个线程对象后,这个线程对象处于新生状态,此时它已经有了相应的内存空间,并已被初始化。处于该状态的线程可通过调用 start( )方法进入就绪状态。2就绪状态处于就绪状态的线程已经具备了运行的条件,但尚未分 配到CPU资源,因而它将进入线程队列排队,等待系统为它分配CPU。一旦获得了CPU资源,

3、该线程就进入运行状态,并自动地调用自己的run方法。此时,它脱离创建它的主线程,独立开始了自己的生命周期。第13章 多线程 3运行状态进入运行状态的线程执行自己的run方法中的代码。若遇到下列情况之一,将终止run方法的执行:(1) 终止操作。调用当前线程的stop方法或destroy方法进入死亡状态。(2) 等待操作。调用当前线程的join(millis)方法或wait(millis)方法进入阻塞状态。当线程进入阻塞状态时,在millis(毫秒)内可由其他线程调用notify或notifyAll方法将其唤醒,进入就绪状态。在millis内若不唤醒,则需等待到当前线程结束。第13章 多线程 (

4、3) 睡眠操作。调用sleep(millis)方法来实现。当前线程停止执行后,会处于阻塞状态,睡眠millis(毫秒)之后重新进入就绪状态。(4) 挂起操作。通过调用suspend方法来实现。将当前线程挂起,进入阻塞状态,之后当其他线程调用当前线程的 resume方法后,才能使其进入就绪状态。(5) 退让操作。通过调用yield方法来实现。当前线程放弃执行,进入就绪状态。(6) 当前线程要求I/O时,则进入阻塞状态。(7) 若分配给当前线程的时间片用完,则当前线程进入就绪状态。若当前线程的run方法执行完,则线程进入死亡状态。第13章 多线程 4阻塞状态一个正在执行的线程在某些特殊情况下,如执

5、行了 suspend、join或sleep方法,或等待I/O设备的使用权,那么它将让出CPU并暂时中止自己的执行,进入阻塞状态。阻塞时它不能进入就绪队列,只有当引起阻塞的原因被消除时,线程才可以转入就绪状态,重新进到线程队列中排队等待 CPU资源,以便从原终止处开始继续运行。5死亡状态处于死亡状态的线程将永远不再执行。线程死亡有两个原因:一是正常运行的线程完成了它的全部工作;二是线程 被提前强制性地终止了。例如,通过执行stop或destroy方法来终止线程。第13章 多线程 13.1.2 Thread类的方法Thread类(线程类)是java.lang包中的一个专门用来创建线程和对线程进行操

6、作的类。Java在Thread类中定义了许多方法,这些方法可以帮助我们运用和处理线程。这些方法可分为四组:(1) 构造方法。该方法用于创建用户的线程对象。表13.1列出了Thread类的构造方法。第13章 多线程 表13.1 java.lang.Thread类的构造方法 第13章 多线程 (2) run( )方法。该方法用于定义用户线程所要执行的操作。(3) 改变线程状态的方法,如start( )、sleep( )、stop( )、suspend( )、resume( )、yield( )和wait( )方法等。这是最常用的一组方法。(4) 其他方法,如setPriority( )、setNa

7、me( )等。表13.2列出了Thread类的后三组方法。第13章 多线程 表13.2 java.lang.Thread类的常用方法 第13章 多线程 第13章 多线程 在Java语言中创建线程对象有两种途径:一是以创建Thread类的子类为途径,二是以实现Runnable接口为途径。用实现Runnable接口的方式创建线程与用继承Thread类的方式创建线程无本质差别,但是,由于Java不支持多继承,因此任何类如果已经继承了某一类时,就无法再继承Thread类,这时只能通过实现接口Runnable的方式创建线程对象。例如,因为小应用程序已经继承了Applet类,所以不能再继承Thread类,

8、而只能通过Runnable接口实现多线程。第13章 多线程 13.1.3 通过继承Thread类方式创建线程前已述及,在Java语言中创建线程对象的途径之一是创建Thread类的子类。创建Thread类的子类时,首先应声明子类的构造方法,其次应用自己定义的run( )方法去覆盖Thread类的run( )方法,即将自己要执行的程序区块写入run( )方法中。【示例程序C13_1.java】 用Thread类的子类创建两个线程对象。第13章 多线程 import java.util.Calendar;class C13_1 extends Thread int pauseTime;String

9、name;public C13_1(int hTime, String hStr)pauseTime = hTime;name = hStr;public void run( ) Calendar now; / Calendar是Java系统提供的日期时间类的类型标识符第13章 多线程 int year,month,date,hour,minute,second;for(int i=1;i10;i+) try now=Calendar.getInstance( ); /取系统时间year=now.get(Calendar.YEAR); /取年值month=now.get(Calendar.MO

10、NTH)+1; /取月值date=now.get(Calendar.DATE); /取日期值hour=now.get(Calendar.HOUR_OF_DAY); /取小时值minute=now.get(Calendar.MINUTE); /取分值second=now.get(Calendar.SECOND); /取秒值System.out.println(“ “+name+“时间: “+year+“ 年 “+month+“ 月 “+date+“ 日 “+ hour+“ 小时 “+minute+“ 分 “+second+“ 秒“); /显示时间Thread.sleep(pauseTime);第

11、13章 多线程 catch(Exception e)System.out.println(“线程错误:“+e);static public void main(String args ) C13_1 myThread1 = new C13_1(2000, “线程A“); / A线程执行一次后睡眠2000毫秒myThread1.start( );C13_1 myThread2 = new C13_1(1000, “线程B“); / B线程执行一次后睡眠1000毫秒myThread2.start( );第13章 多线程 执行这个程序后,可得到如下运行结果(读者上机运行时与这里列出的具体时间不同):

12、 线程A时间: 2012 年 8 月 19 日 9 小时 7 分 2 秒线程B时间: 2012 年 8 月 19 日 9 小时 7 分 2 秒线程B时间: 2012 年 8 月 19 日 9 小时 7 分 3 秒线程A时间: 2012 年 8 月 19 日 9 小时 7 分 4 秒线程B时间: 2012 年 8 月 19 日 9 小时 7 分 4 秒线程B时间: 2012 年 8 月 19 日 9 小时 7 分 5 秒线程A时间: 2012 年 8 月 19 日 9 小时 7 分 6 秒线程B时间: 2012 年 8 月 19 日 9 小时 7 分 6 秒线程B时间: 2012 年 8 月 1

13、9 日 9 小时 7 分 7 秒线程A时间: 2012 年 8 月 19 日 9 小时 7 分 8 秒第13章 多线程 线程B时间: 2012 年 8 月 19 日 9 小时 7 分 8 秒线程B时间: 2012 年 8 月 19 日 9 小时 7 分 9 秒线程A时间: 2012 年 8 月 19 日 9 小时 7 分 10 秒线程B时间: 2012 年 8 月 19 日 9 小时 7 分 10 秒线程A时间: 2012 年 8 月 19 日 9 小时 7 分 12 秒线程A时间: 2012 年 8 月 19 日 9 小时 7 分 14 秒线程A时间: 2012 年 8 月 19 日 9 小

14、时 7 分 16 秒线程A时间: 2012 年 8 月 19 日 9 小时 7 分 18 秒第13章 多线程 13.1.4 通过实现Runnable接口方式创建线程创建线程对象的另一个途径是实现Runnable接口,而Runnable接口只有一个方法run( ),用户新建线程的操作就由这个方法来决定。run( )方法必须由实现此接口的类来实现。定义好run( )方法之后,当用户程序需要建立新线程时,只要以这个实现了run( )方法的类为参数创建系统类Thread的对象,就可以把用户实现的run( )方法继承过来。第13章 多线程 【示例程序C13_2.java】 通过创建两个线程实现“Java

15、 Now!”与矩形框在屏幕上呈相反方向的不停走动。该程序由图13.2所示的三个程序组成: 实现屏幕上的字符“Java Now!”走动的线程程序CString.java; 实现屏幕上矩形框走动的线程程序CSquare.java, 主程序C13_2.java。 第13章 多线程 图13.2 示例程序位置图 第13章 多线程 (1) 主程序C13_2.java:package c2;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Container;import java.awt.Dimension;import

16、javax.swing.JApplet;public class C13_2 extends JApplet Overridepublic void init( ) Container cp=getContentPane( ); /得到窗口容器对象 CString pa=new CString( ); /创建JPanel类的对象第13章 多线程 CSquare pa1=new CSquare( ); /创建JPanel类的对象pa.setPreferredSize(new Dimension(300,150);pa.setBackground(Color.cyan); /设置pa的对象背景颜色pa1.setPreferredSize(new Dimension(300,150);pa1.setBackground(Color.cyan)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号