第5章Java线程.ppt
文本预览下载声明
Java 线程 了解多线程的概念 掌握如何创建线程 了解死锁的概念 掌握线程同步 掌握使用 wait() 和 notify() 在线程之间进行通信 多任务处理 进程是指一种“自包容”的运行程序,有自己的地址空间;线程是进程内部单一的一个顺序控制流 基于进程的特点是允许计算机同时运行两个或更多的程序。 基于线程的多任务处理环境中,线程是最小的处理单位。 基于线程的多任务处理的优点 基于线程所需的开销更少 在多任务中,各个进程需要分配它们自己独立的地址空间 多个线程可共享相同的地址空间并且共同分享同一个进程 进程间调用涉及的开销比线程间通信多 线程间的切换成本比进程间切换成本低 多线程 多线程 在Java中,一个应用程序可以包含多个线程。每个线程执行特定的任务,并可与其他线程并发执行 多线程使系统的空转时间最少,提高CPU利用率 多线程编程环境用方便的模型隐藏CPU在任务间切换的事实 主线程 在Java程序启动时,一个线程立刻运行,该线程通常称为程序的主线程。 主线程的重要性体现在两个方面: 它是产生其他子线程的线程。 通常它必须最后完成执行,因为它执行各种关闭动作。 主线程示例 创建线程-1 通过以下两种方法创建 Thread 对象: - 声明一个 Thread 类的子类,并覆盖 run() 方法。 class mythread extends Thread { public void run( ) {/* 覆盖该方法*/ } } - 声明一个实现 Runnable 接口的类,并实现 run() 方法。 class mythread implements Runnable{ public void run( ) {/* 实现该方法*/ } } 创建线程-2 要触发一个新线程,使用 start() 方法,如: Mythread t = new Mythread(); t.start(); 在调用 start() 方法时,将创建一个新的控制线程,接着它将调用 run() 方法。 run() 方法中的代码定义执行线程所需的功能。 创建线程示例 线程的状态-1 新建 (Born) : 新建的线程处于新建状态 就绪 (Ready) : 在创建线程后,它将处于就绪状态,等待 start() 方法被调用 运行 (Running) : 线程在开始执行时进入运行状态 睡眠 (Sleeping) : 线程的执行可通过使用 sleep() 方法来暂时中止。在睡眠后,线程将进入就绪状态 线程的状态-2 等待 (Waiting) : 如果调用了 wait() 方法,线程将处于等待状态。用于在两个或多个线程并发运行时。 挂起 (Suspended) : 在临时停止或中断线程的执行时,线程就处于挂起状态。 恢复 (Resume) : 在挂起的线程被恢复执行时,可以说它已被恢复。 线程状态-3 阻塞 (Blocked) – 在线程等待一个事件时(例如输入/输出操作),就称其处于阻塞状态。 死亡 (Dead) – 在 run() 方法已完成执行或其 stop() 方法被调用之后,线程就处于死亡状态。 线程的状态4-4 可能使线程暂停执行的条件 线程: 线程优先级比较低,因此它不能获得 CPU 时间。 使用 sleep( ) 方法使线程睡眠。 通过调用 wait( ) 方法,使线程等待。 通过调用 yield( ) 方法,线程已显式出让CPU控制权。 线程由于等待一个文件I/O事件被阻塞。 线程状态的示例 Thread 类中的重要方法-1 Thread 类中的重要方法-2 线程优先级 Java 中的线程优先级是在 Thread 类中定义的常量 NORM_PRIORITY : 值为 5 MAX_PRIORITY : 值为 10 MIN_PRIORITY : 值为 1 缺省优先级为 NORM_PRIORITY 有关优先级的方法有两个: final void setPriority(int newp) : 修改线程的当前优先级 final int getPriority() : 返回线程的优先级 线程同步 有时两个或多个线程可能会试图同时访问一个资源 例如,一个线程可能尝试从一个文件中读取数据,而另一个线程则尝试在同一文件中修改数据 在此情况下,数据可能会变得不一致 为了确保在任何时间点一个共享的资源只被一个线程使用,使用了“同步” 如何在 Java 中获得同步 同步基于“监视器”这一概念。“监视器”是用作互斥锁的对象。在给定时刻,只有一个线程可以拥有监视器。 Java中所有的对象都拥有自己的监视器 两种方式实现同步: 使用同步方法 synchronized void methodA() { } 使用
显示全部