java多线程编程PPT课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
public class java.lang.0bject{ …… public final void notify();//通知方法 public final void notifyAll(); //通知所有的等待 public final void wait();//等待方法 public final void wait(long timeout); public final void wait(long timeout,int nanos);
一、线程的概念
线程的状态与生命周期
每个线程都与生命周期相关联,一个生命周期含有多个可 以互相转换的状态,线程从产生到消亡的生命周期中要经历创 建、就绪、运行、阻塞和死亡五种状态。通过线程的控制与调 度可使线程在这几个状态间转换,每个Java程序中都拥有一个 与main方法对应的主线程,必须在主线程中创建新的线程。
(5)死亡状态:死亡状态是线程生命周期的最后一个阶段,表示线程已 经退出运行状态并且不再进入就绪队列。当线程的run()方法结束或由于其 它原因被终止后,线程便进入消亡状态。线程的终止分为两种形式:一是 自然死亡即线程的run()方法正常结束,二是强制终止线程,如调用destory() 或stop()命令终止线程。
(4) suspend():在Java语言程序中经常需要挂起一个线程而不指定多少时间, 此时可用Thread类提供的suspend()方法,这个方法并不永久地停止线程。
(5) resume():暂停的线程可以重新激活,重新激活的方法为resume()方法。由 于suspend()包含了对象锁,所以它使线程极易出现死锁现象,即被锁住的对象在永 久地等待resume()方法,对暂停的线程不能使用start()方法重新启动该线程。
(1)创建状态:当一个Thread类或其子类的对象被声明并创 建后,该线程对象就处于创建状态。创建状态是线程已经创建 但未开始执行的一个特殊状态。处于创建状态的线程只是一个 空的线程对象,系统不为它分配资源但有自己的内存空间,通 过调用start()方法进入就绪状态。
一、线程的概念
(2)就绪状态:处于就绪状态的线程已经具备运行条件但还未获得时间 片,因此进入线程队列,等待系统为其分配CPU。一旦获得CPU,该线程 便进入运行状态并自动调用自己的Run()方法。
一、线程的概念
(1)start():线程调用该方法启动一个线程,使之从新建状态进入就绪队列,一旦 获得CPU就可以脱离创建它的主线程独立开始自己的生命周期。
(2)run():线程的所有活动都是通过线程体run()方法定义,并实现线程对象被调 用之后所执行的操作。
(3) stop():为强制终止某个线程的执行,Thread类提供了线程最后一个控制即 停止方法stop()。
一、线程的概念
Java语言在0bject类中提供了wait()等待和notify()通知方法,其功能是 用来使线程之间相互协调。当编写程序处理某些特定事件时,它需要等候 某些其他条件(从线程外部加以控制的,相当于外部触发信号)发生变化后来 决定事件处理方法,但是同时又不想在自己线程内部一直等待下去。解决 处理特定事件的最好方案之一便是使用wait()和notify()方法同时配合检查条 件是否满足。在Object类中wait()和notify()的定义为:
线程优先级(Priority)告诉线程监视器该线程的重要性,如 果有大量线程被堵塞并等候运行时,线程监视器按线程的优先 级别对线程排队,一旦空闲,线程监视器会首先选择运行具有 最高优先级的那个线程。当然这并不表示优先级别较低的线程 不会运行,即线程不会因为存在优先级而导致死锁。
一、线程的概念
Java将线程的优先级分为10个等级,分别用 1~10之间的数字表示,数字越大表明线程的优先级 别越高。Thread类中定义了代表线程优先级的三个静 态整型数据成员MIN_ PRIORITY、MAX_PRIORITY和 NORMAL_PRIORITY,分别对应于线程的最高优先级 (10)、最低优先级(1)和普通线程优先级(5)。当创建 一个线程对象时,其默认的优先级别是5。一个线 程的优先级别可以通过调用Thread类中的getPriority()方 法来获得,而通过调用setPriority()方法可以改变一个 线程的优先级别。
(8)wait()和notify():当编写的Java语言程序被分成几个逻辑线程时,需要 清晰地知道这些线程之间应怎样相互通讯。例如网络数据交换程序经常需要 使用Sleep()、Wait()、Suspend()等方法使一个线程进入等待状态,同时需要 另一个线程使用Notify()、Resume()等方法将等待线程激活。
(3)运行状态:当就绪状态的线程被调度并获得处理器资源时便进入运 行状态,这时开始执行run()方法中的代码,直到调用其他方法而终止,或 等待某资源而阻塞,或运行完毕而死亡。
(4)堵塞状态:处于运行状态的线程在某些情况下,如执行睡眠方法或 等待I/O设备操作时,将让出CPU并暂时终止自己的运行进入阻塞状态。阻 塞时线程不能进入就绪队列,只有当引起阻塞的原因消除时,线程才可以 转入就绪状态,重新进入线程队列等待调度。
Biblioteka Baidu
一、线程的概念
线程调度与优先级
在CPU上以某种次序执行多个线程称为调度,调度使JVM 对运行的多个线程进行协调,以避免多个线程争用有限的系统 资源而导致系统死机或崩溃。
为控制线程的协调运行,Java定义了线程监视器来监控系 统中处于就绪状态的所有线程,线程调度采用“抢占式”策略, 按照线程的优先级别选择线程获得处理器。
一、线程的概念
wait()和notify()方法是与对象的锁相关联的,即这两个方 法操纵对象的锁。在Java语言程序中,无论使用sleep()方法还 是suspend()方法,都不会在自己被调用的时候解除对它们所 在对象的锁定。但是在线程对象的synchronized方法中调用 wait()方法进入等待状态时,却可以解除它所在对象的锁,这 就意味着在执行wait()方法期间可以调用线程对象中的其他同 步方法。可以将一个wait()方法置入任何同步方法内部,无论 在类中是否准备进行涉及线程的处理。事实上,能调用wait() 方法的惟一地方是在一个同步的方法或代码块内部。若在一个 不同步的方法内调用wait()或者notify()方法,Java语言程序会 通过编译,但是在运行程序时,就会出现一个非法监视器状态 异常(lllegalMonitorStateException)
}
一、线程的概念
说明:wait()和notify()方法都属于基础类Object的一部分,不像sleep()、 suspend()以及resume()那样属于Thread类的一部分。wait()等待方法可以使 一个线程所在的某一个对象的synchronized方法进入等待状态,直到其他线 程通过notify()通知方法将它唤醒,而且只有在一个notify()方法发生变化的时 候,线程才会被唤醒。在Java语言中,也可以有多个线程同时进入等待状态 并等待同一个唤醒消息notifyAll()将它们唤醒。wait()方法允许将线程置入睡眠 状态,而同时又积极地等待条件的发生来改变睡眠状态。由此可见,wait()和 notify()方法提供了在线程之间进行有效同步的一种手段。
二、线程的实现方法
Runnable接口定义为:
public interface java.lang.Runnable {
public abstract void run();
} Thread类的start()方法用于开始线程的执行,调用start()方 法将导致run()方法的执行,除此之外start()方法不做任何事情。 当线程进入run()方法后便可执行里面的任何程序,一旦run()方 法中的程序代码被执行完毕,则意味着这个线程的自动结束。 run()方法是线程执行的主体,在Java语言应用程序中main()方 法是应用程序的执行起点,对于线程而言run()方法就是线程的 执行起点。线程默认的run()方法是不做任何事情的,需要通过 重载run()方法来完成线程任务。
二、线程的实现方法
线程类Thread
Thread类是在Java语言中实现多线程时最常用的类,在 Thread类中封装了线程的各种属性和方法。Thread类的成员包 括了最常用的启动start()、执行run()、终止stop()、暂停 suspend()线程以及设置线程优先级、实现线程之间通信等各 种方法。Thread类实现了在Java语言的java.lang.Runnable包 中定义的Runnable接口,这个接口只定义了一个公共的run()方 法,run()方法是线程的核心,在run()方法里给新产生的进程分 配任务,任何实现Runnable接口的类都须实现run()方法,一般 在线程类的run()方法中放置线程的主处理逻辑。
一、线程的概念
一个线程的生命周期分为生成、运行、等待、终止等阶段, 各阶段及状态间的转换条件具体如图所示
notify
创建 Start
I/O完成
定时到 睡眠
Sleep
就绪 运行RUN
Suspend
Resume 挂起
等待
Wait
Stop 死亡
请求I/O
阻塞
一、线程的概念
说明:控制一个线程生命周期最常用的方法有start()方法 (启动一个线程)、run()方法(定义线程动作)、sleep()方法(使线 程睡眠一段时间)、suspend()方法(使线程挂起)、resume()方 法(恢复挂起的线程)、yield()方法(把线程移到队列的尾部)、 stop()方法(结束线程生命周期并执行清理工作)、destroy()方 法(结束线程生命周期但不做清理工作)、wait()方法(使一个线 程进入等待状态)、notify()方法(将等待线程激活)。
(6) isAlive():一个线程已经启动而且没有停止则被认为是激活的,可通过测试 线程来判断线程是否被激活。测试方法为isAlive(),如果isAlive()方法返回true,则 该线程是激活的。
一、线程的概念
(7) sleep():Java语言Thread类中提供的sleep()方法是简单地告诉线程 休息多少个毫秒的时间,如果想要推迟一个线程的执行,则可以使用sleep() 方法。当线程睡眠的时候,sleep()方法并不占用系统资源,其他的线程仍然 可以继续工作。一旦延迟时间完毕,则该休眠线程就被激活。sleep()方法的 基本调用形式采用一个以毫秒为单位的参数,它使线程暂停一段规定的延时 时间。当延时完成后,线程则继续工作。由于Java运行系统采用了线程调度 机制,所以通过在run()的主循环中插入对sleep()的调用,一般都可以使Java 语言程序运行得更快一些。因为在正在运行的线程准备进入休眠状态之前, 较短的延迟可能造成sleep()结束调度机制的中断,强迫调度机制将其中止, 并于稍后重新启动,以便该线程能做完它自己的事情,再进入休眠状态。
wait()和sleep()的区别在于wait()方法在执行期解除对象的锁,而且能够 自由地退出wait()方法,因为一个notify()方法便可以强行迫使延迟时间迅速流 逝。第二种基本形式为不采用任何参数,它意味着wait()方法会持续执行,不 会自行结束,直到其他线程notify()方法的介入为止。
一、线程的概念
一个Java多线程程序在Java虚拟机中执行时,每一个线 程的执行过程是由Java执行系统的线程调度来控制的,Java语 言多线程程序自身是不能控制每个线程执行顺序的。在目前的 多任务操作系统中,当一个单一线程被启动以后,它可以被挂 起来,被挂起的线程程序代码并不从计算机内存中清除,只是 暂时不让它执行了,在内存中被挂起的线程还可以重新被恢复 执行,以便保证实现多任务被同时处理。多任务操作系统在任 何时间都可以停止或终止线程,被终止的线程程序代码将被从 计算机内存中清除,被终止的线程是不能再重新恢复执行的。
java多线程编程
一、线程的概念
进程与线程
进程是指可执行程序并存放在计算机存储器空间的一个 指令序列,它是一个动态执行的过程。进程是计算机多任务 操作系统为任务分配资源的最小单位,每个进程都应该有自 己的内存空间。
线程同进程一样,也是一个动态的概念和一个动态的执 行过程,但是线程比进程的内涵要小一个等级,一般一个进 程(应用程序)包含一个或多个线程,线程需要在进程的内存地 址空间中运行,是多任务操作系统用于分配计算机CPU时间 片的最小单位。
一、线程的概念
线程的状态与生命周期
每个线程都与生命周期相关联,一个生命周期含有多个可 以互相转换的状态,线程从产生到消亡的生命周期中要经历创 建、就绪、运行、阻塞和死亡五种状态。通过线程的控制与调 度可使线程在这几个状态间转换,每个Java程序中都拥有一个 与main方法对应的主线程,必须在主线程中创建新的线程。
(5)死亡状态:死亡状态是线程生命周期的最后一个阶段,表示线程已 经退出运行状态并且不再进入就绪队列。当线程的run()方法结束或由于其 它原因被终止后,线程便进入消亡状态。线程的终止分为两种形式:一是 自然死亡即线程的run()方法正常结束,二是强制终止线程,如调用destory() 或stop()命令终止线程。
(4) suspend():在Java语言程序中经常需要挂起一个线程而不指定多少时间, 此时可用Thread类提供的suspend()方法,这个方法并不永久地停止线程。
(5) resume():暂停的线程可以重新激活,重新激活的方法为resume()方法。由 于suspend()包含了对象锁,所以它使线程极易出现死锁现象,即被锁住的对象在永 久地等待resume()方法,对暂停的线程不能使用start()方法重新启动该线程。
(1)创建状态:当一个Thread类或其子类的对象被声明并创 建后,该线程对象就处于创建状态。创建状态是线程已经创建 但未开始执行的一个特殊状态。处于创建状态的线程只是一个 空的线程对象,系统不为它分配资源但有自己的内存空间,通 过调用start()方法进入就绪状态。
一、线程的概念
(2)就绪状态:处于就绪状态的线程已经具备运行条件但还未获得时间 片,因此进入线程队列,等待系统为其分配CPU。一旦获得CPU,该线程 便进入运行状态并自动调用自己的Run()方法。
一、线程的概念
(1)start():线程调用该方法启动一个线程,使之从新建状态进入就绪队列,一旦 获得CPU就可以脱离创建它的主线程独立开始自己的生命周期。
(2)run():线程的所有活动都是通过线程体run()方法定义,并实现线程对象被调 用之后所执行的操作。
(3) stop():为强制终止某个线程的执行,Thread类提供了线程最后一个控制即 停止方法stop()。
一、线程的概念
Java语言在0bject类中提供了wait()等待和notify()通知方法,其功能是 用来使线程之间相互协调。当编写程序处理某些特定事件时,它需要等候 某些其他条件(从线程外部加以控制的,相当于外部触发信号)发生变化后来 决定事件处理方法,但是同时又不想在自己线程内部一直等待下去。解决 处理特定事件的最好方案之一便是使用wait()和notify()方法同时配合检查条 件是否满足。在Object类中wait()和notify()的定义为:
线程优先级(Priority)告诉线程监视器该线程的重要性,如 果有大量线程被堵塞并等候运行时,线程监视器按线程的优先 级别对线程排队,一旦空闲,线程监视器会首先选择运行具有 最高优先级的那个线程。当然这并不表示优先级别较低的线程 不会运行,即线程不会因为存在优先级而导致死锁。
一、线程的概念
Java将线程的优先级分为10个等级,分别用 1~10之间的数字表示,数字越大表明线程的优先级 别越高。Thread类中定义了代表线程优先级的三个静 态整型数据成员MIN_ PRIORITY、MAX_PRIORITY和 NORMAL_PRIORITY,分别对应于线程的最高优先级 (10)、最低优先级(1)和普通线程优先级(5)。当创建 一个线程对象时,其默认的优先级别是5。一个线 程的优先级别可以通过调用Thread类中的getPriority()方 法来获得,而通过调用setPriority()方法可以改变一个 线程的优先级别。
(8)wait()和notify():当编写的Java语言程序被分成几个逻辑线程时,需要 清晰地知道这些线程之间应怎样相互通讯。例如网络数据交换程序经常需要 使用Sleep()、Wait()、Suspend()等方法使一个线程进入等待状态,同时需要 另一个线程使用Notify()、Resume()等方法将等待线程激活。
(3)运行状态:当就绪状态的线程被调度并获得处理器资源时便进入运 行状态,这时开始执行run()方法中的代码,直到调用其他方法而终止,或 等待某资源而阻塞,或运行完毕而死亡。
(4)堵塞状态:处于运行状态的线程在某些情况下,如执行睡眠方法或 等待I/O设备操作时,将让出CPU并暂时终止自己的运行进入阻塞状态。阻 塞时线程不能进入就绪队列,只有当引起阻塞的原因消除时,线程才可以 转入就绪状态,重新进入线程队列等待调度。
Biblioteka Baidu
一、线程的概念
线程调度与优先级
在CPU上以某种次序执行多个线程称为调度,调度使JVM 对运行的多个线程进行协调,以避免多个线程争用有限的系统 资源而导致系统死机或崩溃。
为控制线程的协调运行,Java定义了线程监视器来监控系 统中处于就绪状态的所有线程,线程调度采用“抢占式”策略, 按照线程的优先级别选择线程获得处理器。
一、线程的概念
wait()和notify()方法是与对象的锁相关联的,即这两个方 法操纵对象的锁。在Java语言程序中,无论使用sleep()方法还 是suspend()方法,都不会在自己被调用的时候解除对它们所 在对象的锁定。但是在线程对象的synchronized方法中调用 wait()方法进入等待状态时,却可以解除它所在对象的锁,这 就意味着在执行wait()方法期间可以调用线程对象中的其他同 步方法。可以将一个wait()方法置入任何同步方法内部,无论 在类中是否准备进行涉及线程的处理。事实上,能调用wait() 方法的惟一地方是在一个同步的方法或代码块内部。若在一个 不同步的方法内调用wait()或者notify()方法,Java语言程序会 通过编译,但是在运行程序时,就会出现一个非法监视器状态 异常(lllegalMonitorStateException)
}
一、线程的概念
说明:wait()和notify()方法都属于基础类Object的一部分,不像sleep()、 suspend()以及resume()那样属于Thread类的一部分。wait()等待方法可以使 一个线程所在的某一个对象的synchronized方法进入等待状态,直到其他线 程通过notify()通知方法将它唤醒,而且只有在一个notify()方法发生变化的时 候,线程才会被唤醒。在Java语言中,也可以有多个线程同时进入等待状态 并等待同一个唤醒消息notifyAll()将它们唤醒。wait()方法允许将线程置入睡眠 状态,而同时又积极地等待条件的发生来改变睡眠状态。由此可见,wait()和 notify()方法提供了在线程之间进行有效同步的一种手段。
二、线程的实现方法
Runnable接口定义为:
public interface java.lang.Runnable {
public abstract void run();
} Thread类的start()方法用于开始线程的执行,调用start()方 法将导致run()方法的执行,除此之外start()方法不做任何事情。 当线程进入run()方法后便可执行里面的任何程序,一旦run()方 法中的程序代码被执行完毕,则意味着这个线程的自动结束。 run()方法是线程执行的主体,在Java语言应用程序中main()方 法是应用程序的执行起点,对于线程而言run()方法就是线程的 执行起点。线程默认的run()方法是不做任何事情的,需要通过 重载run()方法来完成线程任务。
二、线程的实现方法
线程类Thread
Thread类是在Java语言中实现多线程时最常用的类,在 Thread类中封装了线程的各种属性和方法。Thread类的成员包 括了最常用的启动start()、执行run()、终止stop()、暂停 suspend()线程以及设置线程优先级、实现线程之间通信等各 种方法。Thread类实现了在Java语言的java.lang.Runnable包 中定义的Runnable接口,这个接口只定义了一个公共的run()方 法,run()方法是线程的核心,在run()方法里给新产生的进程分 配任务,任何实现Runnable接口的类都须实现run()方法,一般 在线程类的run()方法中放置线程的主处理逻辑。
一、线程的概念
一个线程的生命周期分为生成、运行、等待、终止等阶段, 各阶段及状态间的转换条件具体如图所示
notify
创建 Start
I/O完成
定时到 睡眠
Sleep
就绪 运行RUN
Suspend
Resume 挂起
等待
Wait
Stop 死亡
请求I/O
阻塞
一、线程的概念
说明:控制一个线程生命周期最常用的方法有start()方法 (启动一个线程)、run()方法(定义线程动作)、sleep()方法(使线 程睡眠一段时间)、suspend()方法(使线程挂起)、resume()方 法(恢复挂起的线程)、yield()方法(把线程移到队列的尾部)、 stop()方法(结束线程生命周期并执行清理工作)、destroy()方 法(结束线程生命周期但不做清理工作)、wait()方法(使一个线 程进入等待状态)、notify()方法(将等待线程激活)。
(6) isAlive():一个线程已经启动而且没有停止则被认为是激活的,可通过测试 线程来判断线程是否被激活。测试方法为isAlive(),如果isAlive()方法返回true,则 该线程是激活的。
一、线程的概念
(7) sleep():Java语言Thread类中提供的sleep()方法是简单地告诉线程 休息多少个毫秒的时间,如果想要推迟一个线程的执行,则可以使用sleep() 方法。当线程睡眠的时候,sleep()方法并不占用系统资源,其他的线程仍然 可以继续工作。一旦延迟时间完毕,则该休眠线程就被激活。sleep()方法的 基本调用形式采用一个以毫秒为单位的参数,它使线程暂停一段规定的延时 时间。当延时完成后,线程则继续工作。由于Java运行系统采用了线程调度 机制,所以通过在run()的主循环中插入对sleep()的调用,一般都可以使Java 语言程序运行得更快一些。因为在正在运行的线程准备进入休眠状态之前, 较短的延迟可能造成sleep()结束调度机制的中断,强迫调度机制将其中止, 并于稍后重新启动,以便该线程能做完它自己的事情,再进入休眠状态。
wait()和sleep()的区别在于wait()方法在执行期解除对象的锁,而且能够 自由地退出wait()方法,因为一个notify()方法便可以强行迫使延迟时间迅速流 逝。第二种基本形式为不采用任何参数,它意味着wait()方法会持续执行,不 会自行结束,直到其他线程notify()方法的介入为止。
一、线程的概念
一个Java多线程程序在Java虚拟机中执行时,每一个线 程的执行过程是由Java执行系统的线程调度来控制的,Java语 言多线程程序自身是不能控制每个线程执行顺序的。在目前的 多任务操作系统中,当一个单一线程被启动以后,它可以被挂 起来,被挂起的线程程序代码并不从计算机内存中清除,只是 暂时不让它执行了,在内存中被挂起的线程还可以重新被恢复 执行,以便保证实现多任务被同时处理。多任务操作系统在任 何时间都可以停止或终止线程,被终止的线程程序代码将被从 计算机内存中清除,被终止的线程是不能再重新恢复执行的。
java多线程编程
一、线程的概念
进程与线程
进程是指可执行程序并存放在计算机存储器空间的一个 指令序列,它是一个动态执行的过程。进程是计算机多任务 操作系统为任务分配资源的最小单位,每个进程都应该有自 己的内存空间。
线程同进程一样,也是一个动态的概念和一个动态的执 行过程,但是线程比进程的内涵要小一个等级,一般一个进 程(应用程序)包含一个或多个线程,线程需要在进程的内存地 址空间中运行,是多任务操作系统用于分配计算机CPU时间 片的最小单位。