面向对象程序设计第10章
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第 10 章
多线程程序设计
整理ppt
1
线程的定义
进程是一个用来描述处于动态运行状态的应用 程序的概念,即一个进程就是一个执行中的程 序,每个进程都有一块自己独立的地址空间, 并可以包含多个线程。这些线程将共享进程的 地址空间及操作系统分配给这个进程的资源。
线程是指进程中的一个执行流,多线程是指在 一个进程中同时运行多个不同线程,每个线程 分别执行不同的任务。
public class MyThread_2 implements Runnable
{
…
public void run( )
{
……
}
public class MultiThread_2
}
{
public static void main(String args[ ])
{
MyThread_2 thread = new MyThread_2( );
Thread threadObj = new Thread(thread);
threadObj.start();
}
}
整理ppt
7
10.2 线程状态的转换
一个线程的生命周期中,有四个状态,线程就 是在这4个状态之间不断变换,直到死亡为止。
新建状态
start()
()
可运行状态 stop() 执行完成
()死亡状态
关键字synchronized用来与对象的互斥锁联系。当某个 对象用synchronized 修饰时,表明该对象在任一时刻只 能由一个线程访问。此时,如果有第二个线程也要访问 同一个对象,它也试图获取该对象的互斥锁,但因该对 象已经被锁定,则第二个线程必须等待,直到锁被释放 为止。
整理ppt
12
synchronized
• 使用时通过调用Thread类提供的start() 方法
间接地使用它。
整理ppt
4
例:利用Thread类创建线程
public class MyThread_1 extends Thread
{
public void run() {
…… } }
public class MultiThread_1 {
1、synchonized方法
synchronized <方法声明>{ <方法体>
}
或 <方法声明>{
synchronized(this){ <方法体> } }
整理ppt
13
synchronized
2、synchronized块 将synchronized关键字加在某代码块之前,就可声明该代 码块为synchronized块,从而使该代码块成为互斥使用的 代码sy块nc,hr即on其iz中ed的<对代象码名必>须{ 获得对象的锁方能执行。
整理ppt
2
10.1 创建线程
创建线程的两种方法:
1.利用Thread类创建线程 2.利用Runnable接口创建线程
整理ppt
3
1、利用Thread类创建线程
使用这种方式创建、启动线程的基本过程:
• 声明一个Thread类的子类,并且覆盖其中的
run() 成员方法,并将线程执行的程序代码写 在其中。
suspend() sleep() wait()
resume() 睡眠结束 notify()
阻塞状态
整理ppt
8
线程的优先级
• 每一个线程都有一个优先级 ,在Thread类中有3
个常量MIN_PRIORITY、MAX_PRIORITY、 NORMAL_PRIORITY分别表示优先级为1、10和5, 它们代表最低优先级、最高优先级和普通优先级。
<代码块> }
整理ppt
14
例:模拟银行中的存款、取款-1
public class Account {
private String name; private float amount; public synchronized void deposit(float amt) {
float tmp = amount; tmp += amt; try {
• 阻塞线程
wait()
• 唤醒线程
notify() 或 notifyAll() 或 interrupt()
• 线程让步
yield()
• 等待其它线程结束
join()
• 判断线程是否处于活动状态 isAlive()
整理ppt
10
10.4 多线程的同步与互斥
一般来说线程之间不是孤立的,多个线程可能 共享某些资源。比如,一个线程要读取数据,另 外一个线程要处理这些数据。因此,系统必须对 线程进行同步控制,等到第一个线程读取完数据, 第二个线程才能处理该数据,从而避免错误。
• 可以调用Thread类的setPriority(int level)
成员方法为某个线程设置优先级。
• 例如,假设threadObj是一个Thread类对象,可
以用 threadObj.setPriority(6);设置优先级。
整理ppt
9
10.3 线程控制
• 基本的线程控制方法
• 启动线程
start()
public static void main(String args[ ]) {
Thread t1 = new MyThread_1();
t1.setName("T1");
Thread t2 = new MyThread_1();
t2.setName("T2");
t1.start();
t2.star来自百度文库();
简单地说,在一个时刻只能够被一个线程访问 的资源称为临界资源,而访问临界资源的那段代 码则被称为临界区。临界区的使用必须互斥地进 行,即一个线程在临界区中执行代码时,其它线 程不能够进入临界区。
整理ppt
11
synchronized
Java中,引入了对象”互斥锁”的概念,来保证共享数据 操作的完整性。每个Java对象都对应于一个”互斥锁”标 记,这个标记用来保证在任一时刻,只能有一个线程访 问该对象。一旦某个线程获得了该锁,别的线程如果希 望获得该锁,只能等待这个线程释放锁之后。
}
}
整理ppt
5
2、利用Runnable接口创建线程
使用这种方式创建、启动线程的基本过程:
• 声明一个实现Runnable接口的类。 • 以实现Runnable 接口的类对象为参数创建一
个Thread 类对象。
• 调用Thread类对象的start() 方法启动线程。
整理ppt
6
例:利用Runnable接口创建线程
多线程程序设计
整理ppt
1
线程的定义
进程是一个用来描述处于动态运行状态的应用 程序的概念,即一个进程就是一个执行中的程 序,每个进程都有一块自己独立的地址空间, 并可以包含多个线程。这些线程将共享进程的 地址空间及操作系统分配给这个进程的资源。
线程是指进程中的一个执行流,多线程是指在 一个进程中同时运行多个不同线程,每个线程 分别执行不同的任务。
public class MyThread_2 implements Runnable
{
…
public void run( )
{
……
}
public class MultiThread_2
}
{
public static void main(String args[ ])
{
MyThread_2 thread = new MyThread_2( );
Thread threadObj = new Thread(thread);
threadObj.start();
}
}
整理ppt
7
10.2 线程状态的转换
一个线程的生命周期中,有四个状态,线程就 是在这4个状态之间不断变换,直到死亡为止。
新建状态
start()
()
可运行状态 stop() 执行完成
()死亡状态
关键字synchronized用来与对象的互斥锁联系。当某个 对象用synchronized 修饰时,表明该对象在任一时刻只 能由一个线程访问。此时,如果有第二个线程也要访问 同一个对象,它也试图获取该对象的互斥锁,但因该对 象已经被锁定,则第二个线程必须等待,直到锁被释放 为止。
整理ppt
12
synchronized
• 使用时通过调用Thread类提供的start() 方法
间接地使用它。
整理ppt
4
例:利用Thread类创建线程
public class MyThread_1 extends Thread
{
public void run() {
…… } }
public class MultiThread_1 {
1、synchonized方法
synchronized <方法声明>{ <方法体>
}
或 <方法声明>{
synchronized(this){ <方法体> } }
整理ppt
13
synchronized
2、synchronized块 将synchronized关键字加在某代码块之前,就可声明该代 码块为synchronized块,从而使该代码块成为互斥使用的 代码sy块nc,hr即on其iz中ed的<对代象码名必>须{ 获得对象的锁方能执行。
整理ppt
2
10.1 创建线程
创建线程的两种方法:
1.利用Thread类创建线程 2.利用Runnable接口创建线程
整理ppt
3
1、利用Thread类创建线程
使用这种方式创建、启动线程的基本过程:
• 声明一个Thread类的子类,并且覆盖其中的
run() 成员方法,并将线程执行的程序代码写 在其中。
suspend() sleep() wait()
resume() 睡眠结束 notify()
阻塞状态
整理ppt
8
线程的优先级
• 每一个线程都有一个优先级 ,在Thread类中有3
个常量MIN_PRIORITY、MAX_PRIORITY、 NORMAL_PRIORITY分别表示优先级为1、10和5, 它们代表最低优先级、最高优先级和普通优先级。
<代码块> }
整理ppt
14
例:模拟银行中的存款、取款-1
public class Account {
private String name; private float amount; public synchronized void deposit(float amt) {
float tmp = amount; tmp += amt; try {
• 阻塞线程
wait()
• 唤醒线程
notify() 或 notifyAll() 或 interrupt()
• 线程让步
yield()
• 等待其它线程结束
join()
• 判断线程是否处于活动状态 isAlive()
整理ppt
10
10.4 多线程的同步与互斥
一般来说线程之间不是孤立的,多个线程可能 共享某些资源。比如,一个线程要读取数据,另 外一个线程要处理这些数据。因此,系统必须对 线程进行同步控制,等到第一个线程读取完数据, 第二个线程才能处理该数据,从而避免错误。
• 可以调用Thread类的setPriority(int level)
成员方法为某个线程设置优先级。
• 例如,假设threadObj是一个Thread类对象,可
以用 threadObj.setPriority(6);设置优先级。
整理ppt
9
10.3 线程控制
• 基本的线程控制方法
• 启动线程
start()
public static void main(String args[ ]) {
Thread t1 = new MyThread_1();
t1.setName("T1");
Thread t2 = new MyThread_1();
t2.setName("T2");
t1.start();
t2.star来自百度文库();
简单地说,在一个时刻只能够被一个线程访问 的资源称为临界资源,而访问临界资源的那段代 码则被称为临界区。临界区的使用必须互斥地进 行,即一个线程在临界区中执行代码时,其它线 程不能够进入临界区。
整理ppt
11
synchronized
Java中,引入了对象”互斥锁”的概念,来保证共享数据 操作的完整性。每个Java对象都对应于一个”互斥锁”标 记,这个标记用来保证在任一时刻,只能有一个线程访 问该对象。一旦某个线程获得了该锁,别的线程如果希 望获得该锁,只能等待这个线程释放锁之后。
}
}
整理ppt
5
2、利用Runnable接口创建线程
使用这种方式创建、启动线程的基本过程:
• 声明一个实现Runnable接口的类。 • 以实现Runnable 接口的类对象为参数创建一
个Thread 类对象。
• 调用Thread类对象的start() 方法启动线程。
整理ppt
6
例:利用Runnable接口创建线程