收藏 分享(赏)

面向对象程序设计 多线程.ppt

上传人:wspkg9802 文档编号:9533662 上传时间:2019-08-13 格式:PPT 页数:28 大小:285KB
下载 相关 举报
面向对象程序设计 多线程.ppt_第1页
第1页 / 共28页
面向对象程序设计 多线程.ppt_第2页
第2页 / 共28页
面向对象程序设计 多线程.ppt_第3页
第3页 / 共28页
面向对象程序设计 多线程.ppt_第4页
第4页 / 共28页
面向对象程序设计 多线程.ppt_第5页
第5页 / 共28页
点击查看更多>>
资源描述

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

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

3、oid main(String args) Thread t= Thread.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(“主线程被中断“); ,获得当前线程,即主线程,改变线程的内部名称,输

4、出每个数后暂停1500毫秒,9,创建线程,通过以下两种方法创建 Thread 对象: - 声明一个 Thread 类的子类,并覆盖 run() 方法。 class mythread extends Thread public void run( ) /* 覆盖该方法*/ - 声明一个实现 Runnable 接口的类,并实现 run() 方法。 class mythread implements Runnablepublic void run( ) /* 实现该方法*/ ,10,创建线程,要触发一个新线程,使用 start() 方法,如: Mythread t = new Mythread();

5、 t.start(); 在调用 start() 方法时,将创建一个新的控制线程,接着它将调用 run() 方法。 run() 方法中的代码定义执行线程所需的功能。,11,创建线程示例,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.prin

6、tln(“子线程是:“+this); ,或者使用 implements Runnable,12,线程的状态,新建 (Born) : 新建的线程处于新建状态 就绪 (Ready) : 在创建线程后,它将处于就绪状态,等待 start() 方法被调用 运行 (Running) : 线程在开始执行时进入运行状态 睡眠 (Sleeping) : 线程的执行可通过使用 sleep() 方法来暂时中止。在睡眠后,线程将进入就绪状态,13,线程的状态,新建(New) : 当创建对象时,处于New(Thread)状态,它是线程的起点。 可运行(Runnable) : 调用start方法就使线程处于Runnab

7、le状态,并不意味着线程立即运行,这是线程的第二个状态。 运行 (Running) : 如果系统的线程调度程序允许线程运行(即给线程分配了CPU时间),那么这时线程才开始Running(运行),否则仍然处于Runnable状态。 阻塞(Blocked):已经运行中的线程因为某种原因暂时停止运行,这是处于Blocked状态.,14,可能使线程暂停执行的条件,线程: 线程优先级比较低,因此它不能获得 CPU 时间。 使用 sleep( ) 方法使线程睡眠。 通过调用 wait( ) 方法,使线程等待。 通过调用 yield( ) 方法,线程已显式出让CPU控制权。 线程由于等待一个文件I/O事件被

8、阻塞。,15,线程状态的示例,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 在短时间睡眠后重新运行!“); catch (Int

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

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

11、ized void methodA() 使用同步块 synchronized(object) /要同步的语句 ,21,同步方法,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关键字修饰的方法。,class Two implements R

12、unnable 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+);Two s2=new Two(one,digit+);

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

14、 ,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);,23,死锁,当两个线程循环依赖于一对同步对象时将发生死锁。例如:一个线程进入对象ObjA上的监视器,而另一个线程进入对象ObjB上的监视器。如果ObjA中的线程试图调用ObjB上的任何 synchron

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

16、yAll() 方法通知调用 wait() 的所有线程,具有最高优先级的线程将先运行。,26,使用wait-notify 机制示例,class ChopStick boolean available;ChopStick() available=true; public synchronized void takeup() while(!available) try wait(); System.out.println(“哲学家等待另一根筷子“); catch(InterruptedException e) available=false;public synchronized void putdown() available=true;notify(); ,27,总结,多线程允许程序员编写可最大程度利用CPU 的高效程序。 Java 以类和接口的形式为多线程提供内置支持。 Java 程序启动时,一个线程立刻运行,该线程称为主线程。 可通过两种方式创建线程:继承Thread类、实现Runnable 接口。,28,总结,Thread 类的有两个构造函数。 线程的缺省优先级为 5。 作为后台线程并为其他线程提供服务的线程称为精灵线程。 同步是用于确保资源一次只能被一个线程使用的过程。 wait-notify机制用来处理线程间通信,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报