130 likes | 264 Views
第九章. 多线程. 回顾. 输入/输出流的概念和类层次结构 主要字节流的定义和使用 主要字符流的定义和使用 文件管理以及文件操作 对象串行化的概念和实现方法 了解其他常用流的定义和使用. 目标. 掌握多线程的概念 掌握如何创建线程 了解死锁的概念 了解线程同步 了解使用 wait() 和 notify() 在线程之间进行通信. 9.1.1 多线程的概念. 程序: 静态的计算机高级语言编写的代码。 进程:程序的一次执行。 线程: 程序中的部分代码的一次执行过程。 多进程:操作系统中多个程序同时执行。 多线程:程序中多个片断同时执行。.
E N D
第九章 多线程
回顾 • 输入/输出流的概念和类层次结构 • 主要字节流的定义和使用 • 主要字符流的定义和使用 • 文件管理以及文件操作 • 对象串行化的概念和实现方法 • 了解其他常用流的定义和使用
目标 • 掌握多线程的概念 • 掌握如何创建线程 • 了解死锁的概念 • 了解线程同步 • 了解使用 wait() 和 notify() 在线程之间进行通信
9.1.1 多线程的概念 • 程序:静态的计算机高级语言编写的代码。 • 进程:程序的一次执行。 • 线程:程序中的部分代码的一次执行过程。 • 多进程:操作系统中多个程序同时执行。 • 多线程:程序中多个片断同时执行。
9.1.2 Java中的多线程 • Thread类是java.lang包中的一个专门用来创建线程和对线程进行操作的类。这些方法分为: • 构造方法。 • run()方法。 • 改变线程状态的方法。 • 操作线程属性的方法。
9.1.3 线程的状态和生命周期 新建状态 就绪状态 • 新建 : 新建的线程处于新建状态 • 就绪 : 在创建线程后,它将处于就绪状态,等待 start() 方法被调用 • 执行: 线程在开始执行时进入运行状态 • 阻塞:在线程等待一个事件时(例如输入/输出操作),就称其处于阻塞状态。 • 死亡:在 run() 方法已完成执行或其 stop() 方法被调用之后,线程就处于死亡状态。 阻塞状态 运行状态 死亡状态
9.1.4 线程的调度和优先级 • Java 中的线程优先级是在 Thread 类中定义的常量 • NORM_PRIORITY : 值为 5 • MAX_PRIORITY : 值为 10 • MIN_PRIORITY : 值为 1 • 缺省优先级为NORM_PRIORITY • 有关优先级的方法有两个: • final void setPriority(int newp) : 修改线程的当前优先级 • final int getPriority() : 返回线程的优先级
9.2.1 多线程的实现方法 • 通过以下两种方法创建 Thread 对象: 1.声明一个 Thread 类的子类,并覆盖run()方法。 class mythread extends Thread { public void run( ) {/* 覆盖该方法*/} } 2.声明一个实现 Runnable 接口的类,并实现run()方法。 class mythread implements Runnable{ public void run( ) {/* 实现该方法*/} }
9.2.2 多线程的控制 1.终止线程 stop()方法。 2.测试线程状态 isAlive()方法。 3.线程的暂停和恢复 sleep() suspend()和resume() join()
9.3.1 多线程的互斥 • 有时两个或多个线程可能会试图同时访问一个资源 例如,一个线程可能尝试从一个文件中读取数据,而另一个线程则尝试在同一文件中修改数据 • 在此情况下,数据可能会变得不一致 • 为了确保在任何时间点一个共享的资源只被一个线程使用,使用了“互斥” • 两种方式实现互斥: • 使用互斥方法 synchronized void methodA() { } • 使用互斥块 synchronized(object) { //要互斥的语句 }
9.3.2 多线程的同步 • 为避免轮流检测,Java提供了一个线程间通信机制,使用wait()、notify()和notifyAll()方法 。 • 这些方法仅在 synchronized 方法中才能被调用。 • wait()方法告知被调用的线程退出监视器并进入等待状态,直到其他线程进入相同的监视器并调用notify( )方法。 • notify( )方法通知同一对象上第一个调用wait( )线程。 • notifyAll() 方法通知调用 wait()的所有线程,具有最高优先级的线程将先运行。
9.3.3 线程的死锁 • 当两个线程循环依赖于一对同步对象时将发生死锁。例如: 一个线程进入对象ObjA上的监视器,而另一个线程进入对象ObjB上的监视器。如果ObjA中的线程试图调用ObjB上的任何 synchronized 方法,就将发生死锁。 • 死锁很少发生,但一旦发生就很难调试
总结 1、掌握线程的基本概念 2、掌握线程的状态和生命周期 。 3、可通过两种方式创建线程:继承Thread类、实现Runnable 接口。 4、线程的互斥。 5、线程的同步。