Java程序设计项目教程 教学课件 ppt 作者 郭庚麒 周江_ 13章-多线程

上传人:E**** 文档编号:89447667 上传时间:2019-05-25 格式:PPTX 页数:67 大小:186.84KB
返回 下载 相关 举报
Java程序设计项目教程 教学课件 ppt 作者 郭庚麒 周江_ 13章-多线程_第1页
第1页 / 共67页
Java程序设计项目教程 教学课件 ppt 作者 郭庚麒 周江_ 13章-多线程_第2页
第2页 / 共67页
Java程序设计项目教程 教学课件 ppt 作者 郭庚麒 周江_ 13章-多线程_第3页
第3页 / 共67页
Java程序设计项目教程 教学课件 ppt 作者 郭庚麒 周江_ 13章-多线程_第4页
第4页 / 共67页
Java程序设计项目教程 教学课件 ppt 作者 郭庚麒 周江_ 13章-多线程_第5页
第5页 / 共67页
点击查看更多>>
资源描述

《Java程序设计项目教程 教学课件 ppt 作者 郭庚麒 周江_ 13章-多线程》由会员分享,可在线阅读,更多相关《Java程序设计项目教程 教学课件 ppt 作者 郭庚麒 周江_ 13章-多线程(67页珍藏版)》请在金锄头文库上搜索。

1、第13章 多线程,在网络分布式编程盛行的今天,多线程编程已成为现代编程语言普遍具备的功能。Java作为一门网络语言,从内核全面支持多线程技术。多线程是Java程序设计的特色之一,利用多线程技术可以方便地实现任务的并发处理。本章结合代码讲解了线程相关的基本概念,并通过几个实例重点展示Java线程的构造、调度和数据交换的方法。 【学习目标】 理解线程的原理 了解线程的几种状态及相互转换的条件 学会使用多线程编程的两种方式 学会使用线程的同步控制机制,13.1 线程概述,1.线程概念 在多线程程序设计中,线程是程序执行过程中一个子运行序列。和进程概念有所不同,进程是指一个完整程序的执行过程或实例,线

2、程则是一个比进程更细微的程序执行序列划分,是进程的某个子序列。,13.1 线程概述,线程由程序负责管理,而进程由操作系统调度。线程依附于进程的上下文环境中,随进程或父线程执行后启动。多个线程使用相同的地址空间,因此线程之间的通信非常方便。而进程之间使用不同的地址空间,可以单独执行。,13.1 线程概述,进程与线程的区别如下: 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一套变量,一个进程中可以有多个线程。 线程指进程中的一个执行任务,一个进程中可以运行多个线程,多个线程共享数据。 共享数据使得线程间通信比进程间通信更有效,更容易。 线程比进程更轻量级、创建和撤销的开销比进程要小得多

3、,而进程则有利于资源的管理和保护,13.1 线程概述,2线程的几种状态 多线程是为了同步完成多项任务,而不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。,13.1 线程概述,线程有如下几种状态: 新建状态:即线程对象刚刚被创建的状态 就绪状态:也被称为可运行状态,在线程对象被创建之后,如果要执行它,操作系统要对这个线程进行登记,并为它分配系统资源,这些工作由Thread类的start()方法提供,此时线程对象处于“可运行”状态 运行状态:当操作系统分给当前线程时间片时,线程对象就开始运行。如果在分配的时间片段内没有完成,操作系统将暂

4、停该线程对象的运行,即进入阻塞状态,操作系统将分配下一个时间片段给其他线程执行,经过一定的时间循环后,该线程对象可以再次进入运行状态。 阻塞状态:阻塞状态就是一个线程对象因为人为或者系统原因必须暂停运行,以后还可以恢复运行的状态。线程对象的sleep()、 wait() 、suspend()方法被调用及正在等待I/O操作完成时都会进入阻塞状态。 终止状态:当线程对象的run()方法结束后终止或者stop()方法被调用时线程就会终止运行,线程对象stop()方法被调用也称作异常终止。,13.1 线程概述,图13-1 线程的生命周期,13.2 线程的创建,在Java中,可以以多线程方式启动执行的类

5、必须继承java.lang.Thread类,实现该类的run()方法,然后控制线程的执行;而如果只要一段代码在单独线程中运行则可以继承java.lang.Runnable接口,并将该段代码放在该接口run()方法中,然后通过构造Thread类对象实现线程的建立和运行控制。因此,创建多线程程序有两种方法,通过继承Thread类和实现Runnable接口。,13.2 线程的创建,一、Thread类创建多线程应用程序 Thread类提供了用于启动、挂起、恢复以及终止线程的一系列方法,除此之外,还提供了控制线程优先级以及线程的名字等其他方面的方法。使用Thread类建造多线程程序的最简单方法是:将自定

6、义的应用程序类extends(继承)该类,并覆盖run()方法,当线程开始启动时会调用这个方法。通过覆盖run()方法,就可以使线程在后台完成一些有用的任务。然后,在该类中添加一个Application都必须定义的main()方法,在main()方法中声明一个Thread类型的对象使之指向自定义应用程序类的实例。再通过该对象调用Thread类提供的start()方法启动线程,该方法会调用前面定义的run()方法,并使之脱离main()方法的主线程,在操作系统中申请新的线程运行。,【任务13-1】两个同时运行的打印标签的程序,下面的任务显示了怎样扩展Thread类,并启动两个实例,每个实例都在一

7、个独立的线程中。 (一)任务描述 假设有种打印标签的机器,该机器可以设置打印标签的文字和每两个标签之间间隔的时间,需要模拟两个机器同时工作产生的标签情况。,(二)任务分析 这个例子可以用多线程编程来实现 首先创建一个类ExtendThreadDemo来模拟打印标签的机器,让该类继承Thread类,然后实现Thread类的run()方法,在run方法中根据输入的参数决定多久时间间隔打印一个包含什么文字的标签。 然后在main函数中创建两个该类的对象,即两个线程,并分别启动他们。这时候,程序的输出就是模拟地打印两个机器的标签。,public class ExtendThreadDemo exten

8、ds Thread /继承Thread类 String labelName; int sleepTime; public ExtendThreadDemo(String label,int time) /线程类构造函数 labelName=label; sleepTime=time; ,public void run()/线程体 try for (int i=0;i=4;i+) Thread.sleep(sleepTime);/休眠 System.out.println(labelName); catch(InterruptedException ie) System.out.println

9、(labelName+“ is over“); ,public static void main(String args) System.out.println(“Creating thread print A“); Thread t1=new ExtendThreadDemo(“A“,500); /创建线程实例 System.out.println(“Creating thread print B“); Thread t2=new ExtendThreadDemo(“B“,1000); t1.start();/启动线程 t2.start(); System.out.println(“main

10、 is finished“); ,输出结果,Creating thread print A Creating thread print B main is finished A A B A B A A A is over B B B B is over,二、使用Runnable接口创建多线程应用程序,由于Java只支持单重继承,使用扩展Thread类的方式实现多线程,就会导致应用程序不能继承其他的类,在构造复杂程序时很不方便。使程序能够多线程执行的更好的方法是实现java.lang.Runnable接口。 Runnable接口唯一的定义了一个run()方法,实现该接口必须实现这个方法。应用程序

11、类实现了这个接口则该类可以以多线程的方式执行。一个线程是main()方法构成的主线程,一个是run()方法为主体的独立线程。 创建这类多线程程序的方法是定义类时声明实现Runnable接口并写好线程体run()方法,然后在main()方法中声明并创建Runnable类型的对象,以该对象为构造参数,声明并构造Thread对象,当调用了线程对象的start()方法时,新创建的线程就会调用run()方法。run()方法结束时,线程便停止。 注意,同一个Runnable对象可以被传递给多个线程,所以几个并发的线程可以使用相同的代码,并操作相同的数据。 使用Runnable接口实现多线程程序还有一个好处

12、就是使用Runnable实例作构造参数创建多个Thread实例比创建多个经过扩展的Thread实例开销要小。,下面的范例中实现了类似【任务13-1】的功能。,public class RunnableThreadDemo implements java.lang.Runnable /继承Runnable接口 String label; int sleepTime; public RunnableThreadDemo(String label, int sleepTime) super(); this.label = label; this.sleepTime = sleepTime; ,pub

13、lic void run()/定义线程体 try for (int i=0;i=4;i+) System.out.println(label); Thread.sleep(sleepTime); System.out.println(label+“is over“); catch (InterruptedException e) e.printStackTrace(); ,public static void main(String args) System.out.println (“Creating runnable object“); Runnable run1 = new Runnab

14、leThreadDemo(“A“,500); /创建线程接口实例 Thread t1 = new Thread (run1); /依据线程接口实例创建线程实例 Runnable run2 = new RunnableThreadDemo(“B“,1000); /创建线程接口实例 Thread t2 = new Thread (run2); /依据线程接口实例创建线程实例 System.out.println (“Starting both threads“); t1.start();/启动线程 t2.start(); ,Creating runnable object Starting bot

15、h threads A B A B A A A B Ais over B B Bis over,程序输出,13.3 线程的生存周期,每个线程从生成实例获得资源到运行结束、释放空间要经历三种基本的状态。线程实例在内存中创建后线程处于就绪状态,然后在父线程中通过调用Thread类的start()方法来启动线程体run()方法。线程进入运行状态,当线程因需要的某个资源被其他线程占用等原因而进入等待状态。线程体执行完毕或被父线程终止时,线程结束。Java提供了很多方法可以对线程的生存周期进行各种控制和调度,以灵活实现程序的功能。,13.3 线程的生存周期,一、线程的优先级 在支持多线程的系统中,多线程

16、是通过在线程之间快速切换来模拟代码的并发执行而实现的。由于操作系统使用单个线程不能控制的任意算法在线程之间进行切换,线程的执行顺序、运行时间和调度线程的时间是无法预测的。为了加强对线程的调度,最简单的方式是设定线程的相对优先级,指示操作系统哪个线程更重要。,1、设置线程优先级 在Java中,用数字1-10指明了线程的优先级,其中,10是最高优先级,1是最低优先级。较高优先级的线程将抢占较低优先级的线程的CPU资源。优先级调度在不同的操作系统中执行效果可能不同。有的操作系统会分配较多的运行时间给高优先级的线程。有的操作系统中,高优先级的线程可迫使低优先级的线程挂起,回到优先级队列中等待,直到正在运行的线程主动暂停运行。有3个优先级别在java.lang.Thread类中定义了静态成员常量,见下表: 使用setPriority()方法可以设置线程的优先级。注意,可以在启动线程之前设置线程的优先级,也可以在线程运行过程中改变线程的

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

当前位置:首页 > 高等教育 > 大学课件

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