JAVA语言面向对象程序设计 教学课件 ppt 作者 马俊 ppt 8JAVA

上传人:E**** 文档编号:89243431 上传时间:2019-05-21 格式:PPT 页数:29 大小:268.01KB
返回 下载 相关 举报
JAVA语言面向对象程序设计 教学课件 ppt 作者 马俊 ppt 8JAVA_第1页
第1页 / 共29页
JAVA语言面向对象程序设计 教学课件 ppt 作者 马俊 ppt 8JAVA_第2页
第2页 / 共29页
JAVA语言面向对象程序设计 教学课件 ppt 作者 马俊 ppt 8JAVA_第3页
第3页 / 共29页
JAVA语言面向对象程序设计 教学课件 ppt 作者 马俊 ppt 8JAVA_第4页
第4页 / 共29页
JAVA语言面向对象程序设计 教学课件 ppt 作者 马俊 ppt 8JAVA_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《JAVA语言面向对象程序设计 教学课件 ppt 作者 马俊 ppt 8JAVA》由会员分享,可在线阅读,更多相关《JAVA语言面向对象程序设计 教学课件 ppt 作者 马俊 ppt 8JAVA(29页珍藏版)》请在金锄头文库上搜索。

1、线程,第八章,2,目标,了解多线程的概念 掌握如何创建线程 了解死锁的概念 掌握线程同步 掌握使用 wait() 和 notify() 在线程之间进行通信,3,多任务处理,进程是指一种“自包容”的运行程序,有自己的地址空间;线程是进程内部单一的一个顺序控制流 基于进程的特点是允许计算机同时运行两个或更多的程序。 基于线程的多任务处理环境中,线程是最小的处理单位。,多任务处理有两种类型: - 基于进程 - 基于线程,4,基于线程的多任务处理的优点,基于线程所需的开销更少 在多任务中,各个进程需要分配它们自己独立的地址空间 多个线程可共享相同的地址空间并且共同分享同一个进程 进程间调用涉及的开销比

2、线程间通信多 线程间的切换成本比进程间切换成本低,5,多线程,多线程 在Java中,一个应用程序可以包含多个线程。每个线程执行特定的任务,并可与其他线程并发执行 多线程使系统的空转时间最少,提高CPU利用率 多线程编程环境用方便的模型隐藏CPU在任务间切换的事实,6,主线程,在Java程序启动时,一个线程立刻运行,该线程通常称为程序的主线程。 主线程的重要性体现在两个方面: 它是产生其他子线程的线程。 通常它必须最后完成执行,因为它执行各种关闭动作。,7,主线程示例,class Mythread public static void main(String args) Thread t= Th

3、read.currentThread(); System.out.println(“当前线程是: “+t); t.setName(“MyJavaThread“); System.out.println(“当前线程名是: “+t); try for(int i=0;i3;i+) System.out.println(i); Thread.sleep(1500); catch(InterruptedException e) System.out.println(“主线程被中断“); ,获得当前线程,即主线程,改变线程的内部名称,输出每个数后暂停1500毫秒,8,创建线程 2-1,通过以下两种方法创

4、建 Thread 对象: - 声明一个 Thread 类的子类,并覆盖 run() 方法。 class mythread extends Thread public void run( ) /* 覆盖该方法*/ - 声明一个实现 Runnable 接口的类,并实现 run() 方法。 class mythread implements Runnable public void run( ) /* 实现该方法*/ ,9,创建线程 2-2,要触发一个新线程,使用 start() 方法,如: Mythread t = new Mythread(); t.start(); 在调用 start() 方法

5、时,将创建一个新的控制线程,接着它将调用 run() 方法。 run() 方法中的代码定义执行线程所需的功能。,10,创建线程示例,class MyThread1 extends Thread public static void main(String args) Thread t= Thread.currentThread(); System.out.println(“主线程是: “+t); MyThread1 ex = new MyThread1(); ex.start(); public void run() System.out.println(“子线程是:“+this); ,或者使

6、用 implements Runnable,11,线程的状态 4-1,新建 (Born) : 新建的线程处于新建状态 就绪 (Ready) : 在创建线程后,它将处于就绪状态, start() 方法被调用 运行 (Running) : 线程在开始执行时进入运行状态 睡眠 (Sleeping) : 线程的执行可通过使用 sleep() 方法来暂时中止。在睡眠后,线程将进入就绪状态,12,线程的状态4-2,等待 (Waiting) : 如果调用了 wait() 方法,线程将处于等待状态。用于在两个或多个线程并发运行时。 挂起 (Suspended) : 在临时停止或中断线程的执行时,线程就处于挂起

7、状态。 恢复 (Resume) : 在挂起的线程被恢复执行时,可以说它已被恢复。,13,阻塞 (Blocked) 在线程等待一个事件时(例如输入/输出操作),就称其处于阻塞状态。 死亡 (Dead) 在 run() 方法已完成执行或其 stop() 方法被调用之后,线程就处于死亡状态。,线程状态4-3,14,线程的状态 4-4,15,可能使线程暂停执行的条件,线程: 线程优先级比较低,因此它不能获得 CPU 时间。 使用 sleep( ) 方法使线程睡眠。 通过调用 wait( ) 方法,使线程等待。 通过调用 yield( ) 方法,线程已显式出让CPU控制权。 线程由于等待一个文件I/O事

8、件被阻塞。,16,线程状态的示例,class ThreadStateDemo extends Thread Thread t; public ThreadStateDemo() t=new Thread(this); System.out.println (“线程 t 为新建!“); System.out.println (“线程 t 为就绪!“); t.start(); public void run() try System.out.println (“线程 t 在运行!“); t.sleep(500); System.out.println(“线程 t 在短时间睡眠后重新运行!“); c

9、atch (InterruptedException IE) System.out.println(“线程被中断“); ,public static void main(String args) new ThreadStateDemo(); ,17,Thread 类中的重要方法 2-1,18,Thread 类中的重要方法 2-2,19,线程优先级,Java 中的线程优先级是在 Thread 类中定义的常量 NORM_PRIORITY : 值为 5 MAX_PRIORITY : 值为 10 MIN_PRIORITY : 值为 1 缺省优先级为 NORM_PRIORITY 有关优先级的方法有两个:

10、 final void setPriority(int newp) : 修改线程的当前优先级 final int getPriority() : 返回线程的优先级,20,线程同步,有时两个或多个线程可能会试图同时访问一个资源 例如,一个线程可能尝试从一个文件中读取数据,而另一个线程则尝试在同一文件中修改数据 在此情况下,数据可能会变得不一致 为了确保在任何时间点一个共享的资源只被一个线程使用,使用了“同步”,21,如何在 Java 中获得同步,同步基于“监视器”这一概念。“监视器”是用作互斥锁的对象。在给定时刻,只有一个线程可以拥有监视器。 Java中所有的对象都拥有自己的监视器 两种方式实现

11、同步: 使用同步方法 synchronized void methodA() 使用同步块 synchronized(object) /要同步的语句 ,22,同步方法,class One synchronized void display(int num) System.out.print(“+num); try Thread.sleep(1000); catch(InterruptedException e) System.out.println(“中断“); System.out.println(“ 完成“); ,进入某一对象的监视器,就是调用被synchronized关键字修饰的方法。,c

12、lass Two implements Runnable int number; One one; Thread t; public Two(One one_num, int n) one=one_num; number=n; t=new Thread(this); t.start(); public void run() one.display(number); ,public class Synch public static void main(String args) One one=new One(); int digit=10; Two s1=new Two(one,digit+)

13、; Two s2=new Two(one,digit+); Two s3=new Two(one,digit+); s1.t.join(); s2.t.join(); s3.t.join(); ,23,同步块,如果无法在相关方法前加synchronized 修饰符,只需将对这个类定义的方法的调用放入一个synchronized 块内就可以了。,class One void display(int num) System.out.print(“+num); try Thread.sleep(1000); catch(InterruptedException e) System.out.print

14、ln(“中断“); System.out.println(“ 完成“); ,class Two implements Runnable int number; One one; Thread t; public Two(One one_num,int n) one=one_num; number=n; t=new Thread(this); t.start(); public void run() synchronized(one) one.display(number); ,同步代码块,24,死锁,当两个线程循环依赖于一对同步对象时将发生死锁。例如: 一个线程进入对象ObjA上的监视器,而另

15、一个线程进入对象ObjB上的监视器。如果ObjA中的线程试图调用ObjB上的任何 synchronized 方法,就将发生死锁。 死锁很少发生,但一旦发生就很难调试。,Pcdead.java,25,wait-notify 机制 2-1,为避免轮流检测,Java提供了一个精心设计的线程间通信机制,使用wait()、notify()和notifyAll()方法 。 这些方法是作为 Object 类中的 final 方法实现的。 这三个方法仅在 synchronized 方法中才能被调用。,26,wait-notify 机制 2-2,wait()方法告知被调用的线程退出监视器并进入等待状态,直到其他

16、线程进入相同的监视器并调用 notify( ) 方法。 notify( ) 方法通知同一对象上第一个调用 wait( )线程。 notifyAll() 方法通知调用 wait() 的所有线程,具有最高优先级的线程将先运行。,27,使用wait-notify 机制示例,28,总结 2-1,多线程允许程序员编写可最大程度利用CPU 的高效程序。 Java 以类和接口的形式为多线程提供内置支持。 Java 程序启动时,一个线程立刻运行,该线程称为主线程。 可通过两种方式创建线程:继承Thread类、实现Runnable 接口。,29,总结2-2,Thread 类的有两个构造函数。 线程的缺省优先级为 5。 作为后台线程并为其他线程提供服务的线程称为精灵线程。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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

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