Java程序设计教程 教学课件 ppt 作者 曾令明 7-11 第10章

上传人:E**** 文档编号:89372852 上传时间:2019-05-24 格式:PPT 页数:74 大小:730KB
返回 下载 相关 举报
Java程序设计教程 教学课件 ppt 作者 曾令明 7-11 第10章_第1页
第1页 / 共74页
Java程序设计教程 教学课件 ppt 作者 曾令明 7-11 第10章_第2页
第2页 / 共74页
Java程序设计教程 教学课件 ppt 作者 曾令明 7-11 第10章_第3页
第3页 / 共74页
Java程序设计教程 教学课件 ppt 作者 曾令明 7-11 第10章_第4页
第4页 / 共74页
Java程序设计教程 教学课件 ppt 作者 曾令明 7-11 第10章_第5页
第5页 / 共74页
点击查看更多>>
资源描述

《Java程序设计教程 教学课件 ppt 作者 曾令明 7-11 第10章》由会员分享,可在线阅读,更多相关《Java程序设计教程 教学课件 ppt 作者 曾令明 7-11 第10章(74页珍藏版)》请在金锄头文库上搜索。

1、,第10章 多线程编程,10.1 线程的概念 10.2 Thread类与Runnable接口 10.3 在程序中实现多线程 10.4 线程的控制与调度 10.5 线程间的同步 10.6 线程间的通信 练习题,10.1 线 程 的 概 念,10.1.1 程序与进程 程序是一个静态的概念,它是指用某种语言编写的,符合一定语法规则并具有一定功能的一些指令的集合。程序往往由开始、处理和结束三部分组成。它的表现形式可能是一个文件,也可能是一组程序的集合。而进程可简单理解为一段正在运行的程序,它是已经开始执行,但尚未结束的一种程序的状态,因此,相对于程序来说,进程可以看做是一个动态的概念。进程通常是一个可

2、执行程序在内存的一个完整副本,每个进程都有自己的数据段、栈段和代码段,因此它是一段完整的程序,在内存中占据较大的空间。,10.1.2 进程与线程 尽管进程的出现成为计算机系统的一个重大进步,但也存在缺点。每调度一个进程,都要将其上次被执行的情况恢复到CPU和寄存器中,由于每个进程都有自己的数据段、栈段和代码段,这样恢复现场工作需要占用大量系统资源,因此,进程调度对操作系统而言是一种开销很大的工作。然而,并不是每一步工作都需要这样“大动干戈”,一次进程调度可能只是其中很小的一部分代码被分开执行,其使用的数据段和代码段差别很小,因此,过于频繁和没有必要的进程调度是影响操作系统工作效率的一个重要因素

3、。随着技术的发展和人们对计算机系统理解的加深,开始逐渐出现了解决这一问题的方法,即使用线程。这样,一个进程就可能同时为用户做多件事了。例如,一个Hotjava的浏览器,它在下载一些图片的同时,也能供用户浏览已经下载下来的页面部分,这就是通过线程机制为用户服务的典型例子。,10.1.3 线程的结构 线程的基本结构如图10-1所示。它包含三个主要部分,第一是虚拟CPU本身,第二是CPU执行的代码即Code,第三是代码操作的数据即Data。在Java中虚拟CPU体现于Thread类中。当一个线程被构造时,它由构造方法参数、执行代码、操作数据来初始化。应该特别注意的是,这三方面是各自独立的。一个线程所

4、执行的代码与其他线程可以相同也可以不同,一个线程访问的数据与其他线程可以相同也可以不同。,图10-1 线程的基本结构,10.2 Thread类与Runnable接口 10.2.1 Thread类 Thread类支持新线程。它实现了Runnable接口,所以读者不需要自己实现Runnable接口。 1构造函数 (1) Thread():构造一个新的Thread对象。 (2) Thread(Runnable target):使用Runnable对象构造一个新的Thread对象。 (3) Thread(String name):使用名字构造一个新的Thread对象。,2其他的方法 (1) void

5、start():使线程开始,也就是说,Java虚拟机将调用线程的run()方法。 (2) void run():用来定义线程对象被调度之后所执行的操作。在系统的Thread类中,run()方法没有具体内容,用户创建自己的Thread类的子类,需要重写run()方法。 (3) Static void sleep(long millis):当前的线程暂停指示的毫秒数。 (4) Static void sleep(long millis,int nanos):当前执行线程暂停指示的毫秒数加上指示的纳秒数。,注意:sleep()方法为Thread的静态方法,这意味着这个方法可以用类名、方法名使用它。当

6、调用sleep()时,处理器会使当前线程休眠并运行另一个线程,直到休眠时间截止时唤醒休眠的线程。然而,也有可能某些线程会中断正在休眠的线程,这时,处理器会提前唤醒休眠的线程,而sleep()方法会抛出InterruptedException对象代替正常返回。,【例10-1】线程使用示例。 import java.applet.*; import java.awt.*; import java.awt.event.*; public class ThreadTest1 extends Applet implements ActionListener Toolkit toolkit; Button

7、 button; public void init() toolkit=getToolkit(); /获得一个工具包对象,工具包中含有发声的beep()方法 button=new Button(“确定“);,add(button); button.addActionListener(this); public void actionPerformed(ActionEvent e) if(e.getSource()=button) for(int i=0;i=9;i+) toolkit.beep(); try Thread.sleep(500); catch(InterruptedExcepti

8、on e1) ,图10-2 例10-1运行结果,10.2.2 Runnable接口 由于Java中的继承为单继承,这意味着如果从Thread类继承,便不能从其他类继承,所以在很多时候我们使用Runnable接口来实现多线程。 Runnable接口中只有一个run()方法,实现了Runnable接口的用户类必须实现此方法。用户把想要新线程执行的代码放到此方法中。创建了新的Runnable对象后,用户可以把该对象传递给Thread类的构造函数来创建新进程。 提示:到底是选择扩展Thread还是实现Runnable接口来创建线程,这要取决于类的层次结构。因为Java中的类是单一继承的,所以,当一个类

9、已经有明确的父类时,则只能用实现Runnable接口的方式来创建线程。,10.3 在程序中实现多线程 10.3.1 使用Thread类创建线程 【例10-2】使用Thread类创建线程。 public class MT_1 static Boy boy; static Girl girl; public static void main(String args) boy=new Boy(); /创建两个线程,然后调用start()方法, girl=new Girl(); /run()方法将自动被执行。 boy.start(); girl.start(); ,class Boy extends

10、Thread public void run() for(int i=0;i=5;i+) System.out.println(“I am a boy“); try sleep(500); catch(InterruptedException e) ,class Girl extends Thread public void run() for(int i=0;i=5;i+) System.out.println(“I am a girl“); try sleep(300); catch(InterruptedException e) ,程序运行结果为: I am a boy I am a g

11、irl I am a girl I am a boy I am a girl I am a girl I am a boy I am a girl I am a boy I am a girl I am a boy I am a boy,10.3.2 实现Runnable接口 【例10-3】实现Runnable接口示例。 class Boy implements Runnable Thread boy; Boy() boy=new Thread(this); boy.start(); public void run() for(int i=0;i=5;i+) System.out.printl

12、n(“I am a boy“); try Thread.sleep(500);,catch(InterruptedException e) class Girl implements Runnable Thread girl; Girl() girl=new Thread(this); girl.start(); public void run() for(int i=0;i=5;i+) System.out.println(“I am a girl“);,try Thread.sleep(300); catch(InterruptedException e) public class MT_

13、2 public static void main(String args) Boy boy=new Boy(); Girl girl=new Girl(); ,程序运行结果为: I am a boy I am a girl I am a girl I am a boy I am a girl I am a girl I am a boy I am a girl I am a boy I am a girl I am a boy I am a boy,【例10-4】分析下面程序的运行结果。 import java.awt.*; import java.applet.*; import java

14、.util.Date; public class DigitalClock extends Applet implements Runnable Font font = new Font (“TimesRoman“, Font. BOLD, 14); Date date; Thread thRunner; public void run() while(true) date=new Date();,repaint(); try Thread.sleep(1000); catch(InterruptedException e) public void paint(Graphics g) g.se

15、tFont(font); g.drawString(date.toString(),10,50); public void start() if (thRunner=null) thRunner=new Thread(this) ; thRunner.start(); ,public void stop() if (thRunner!=null) /浏览器在离开该页面时终止该线程的执行 thRunner.stop() ; thRunner=null; ,图10-3 例10-4运行结果,【例10-5】分析下面程序的运行结果。 import java.applet.*; import java.awt.*;

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

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

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