2009-7-29 北京理工大学计算机系(共 28页) 1
第十二讲 多线程
2009-7-29 北京理工大学计算机系(共 28页) 2
介绍
什么是并行计算?为什么要采用并行计算?
并行计算功能一般是由 OS提供的。
在多 CPU的计算机上,多线程
(multithreading)可以实现并行计算。
Java提供了内嵌多线程的功能
2009-7-29 北京理工大学计算机系(共 28页) 3
线程与进程
理解线程与进程的概念
2009-7-29 北京理工大学计算机系(共 28页) 4
1 线程对象
2009-7-29 北京理工大学计算机系(共 28页) 5
开发多线程程序最简单的方法
定义一个类,继承自 Thread类,重载其
public void run() 方法
实例,EraserThread.java
( 1)先看一下无线程情况
( 2)自定义一个 EraserThread类
( 3)主程序中启动线程
2009-7-29 北京理工大学计算机系(共 28页) 6
Thread类
提供了控制线程的几个方法
构造函数:
public Thread( String threadName )
public Thread()
重载 run方法,定义要以多线程方式完成的工作。
Sleep(),makes thread inactive
Interrupt(),interrupts a running thread
isAlive (),checks status of a thread
setName(),sets a thread’s name
Join():
– Waits for this thread to finish
– (等待本线程停止)
2009-7-29 北京理工大学计算机系(共 28页) 7
多线程第二种方法
一个类实现 java.lang.Runable接口即可,同样实现一个 public void run()方法,
实例,EraserDemo
更复杂的实例,ThreadTest
2009-7-29 北京理工大学计算机系(共 28页) 8
线程的生命周期
Thread的状态
– Born,(创建 )
Thread was just created
– Ready,(就绪 )
Thread’s start method invoked
Thread can now execute
– Running,(运行 )
Thread is assigned a processor and running
– Dead state,(死亡 )
Thread has completed or exited
Eventually disposed of by system
2009-7-29 北京理工大学计算机系(共 28页) 9
线程状态转换体现了一个线程的生命周期
2009-7-29 北京理工大学计算机系(共 28页) 10
线程状态转换示例
中断一个线程:
InterruptDemo.java
线程调用 Sleep进入睡眠状态,用
Interrupt方法中断它
需要仔细分析程序流程
2009-7-29 北京理工大学计算机系(共 28页) 11
线程组 (Thread Groups)
ThreadGroup类:
– 将一批线程做成一组统一管理
– 每一组线程组有一个唯一的名字
Java中的线程组可以有父子关系,
Method calls sent to parent group
also sent to child groups
ThreadGroup parent=new ThreadGroup(“parent”)
ThreadGroup child=new ThreadGroup(parent,”Child”)
2009-7-29 北京理工大学计算机系(共 28页) 12
向线程组中增加新线程
Thread t1=new
Thread(parent,”t1”)
Thread t2=new Thread(child,”t2”)
线程组提供以下方法,
stop suspend resume
2009-7-29 北京理工大学计算机系(共 28页) 13
线程组示例
ThreadGroupDemo
采用匿名类,为线程组重定义
uncaughtException()方法统一处理线程组中的未捕获异常
2009-7-29 北京理工大学计算机系(共 28页) 14
线程优先级 (Priority)
Java thread priority
– Priority in range 1-10
操作系统的 Timeslicing,根据优先级进行
2009-7-29 北京理工大学计算机系(共 28页) 15
线程调度策略
非抢占调度,英国的绅士风度,java中使用 Thread类的 yield()方法实现
抢占时间片调度,讲究公平
2009-7-29 北京理工大学计算机系(共 28页) 16
2 线程同步
2009-7-29 北京理工大学计算机系(共 28页) 17
Daemon线程
背景执行的线程,当主线程结束时自动结束
实例,DaemonThread
2009-7-29 北京理工大学计算机系(共 28页) 18
等待另一个线程的结束
A线程正在运行,希望插入一个 B线程,
要求 B先执行完毕,A才继续运行
使用 Join方法
Join的含义是:将某一线程加入成为另一个线程的流程之一。
2009-7-29 北京理工大学计算机系(共 28页) 19
join()
声明:
public final void join()
throws InterruptedException
功能:
Waits for this thread to die,
2009-7-29 北京理工大学计算机系(共 28页) 20
示例
示例,join
运行状况:
一定要等到 B线程完成了,
主线程后面的代码才执行
。
2009-7-29 北京理工大学计算机系(共 28页) 21
线程同步
示例,PersonalInfo
由于多个线程同时访问一个对象,造成程序错误
2009-7-29 北京理工大学计算机系(共 28页) 22
更正错误
加入 synchronized关键字于方法
setNameAndID之前
2009-7-29 北京理工大学计算机系(共 28页) 23
线程同步 (Synchronization)
Java 使用一个监视器 (monitors)来实现线程同步
synchronized关键字:
1,每一个具有 synchronized 方法的对象都自动拥有一个 monitor
2,一次只能有一个线程来执行这个方法
3,其余的线程阻塞,直到此方法执行完毕
4,当方法执行完毕,下一个最高优先级的线程运行
2009-7-29 北京理工大学计算机系(共 28页) 24
线程同步代码块
亦可使用
synchronized(Object){
//需要同步的代码
}
即将要访问此对象的代码放入到此同步块中,
2009-7-29 北京理工大学计算机系(共 28页) 25
线程同步实例分析
下面将介绍经典的,生产者 ---消费者,
问题,
生产者生产 10个数,消费者依次消费
10个数,生产者不生产数,消费者需等待,
消费者未消费数,生产者需等待
用多线程来实现
2009-7-29 北京理工大学计算机系(共 28页) 26
无同步时的情况
2009-7-29 北京理工大学计算机系(共 28页) 27
有同步时的情况
使用 wait等待,使用 notify通知
2009-7-29 北京理工大学计算机系(共 28页) 28
线程综合实例
下面的例子实现了一个 Applet,设计了一个实现 Runnable接口的自定义类,
然后,利用了 synchronized 实现三个线程的同时运行,并允许暂停。注意分析代码。
第十二讲 多线程
2009-7-29 北京理工大学计算机系(共 28页) 2
介绍
什么是并行计算?为什么要采用并行计算?
并行计算功能一般是由 OS提供的。
在多 CPU的计算机上,多线程
(multithreading)可以实现并行计算。
Java提供了内嵌多线程的功能
2009-7-29 北京理工大学计算机系(共 28页) 3
线程与进程
理解线程与进程的概念
2009-7-29 北京理工大学计算机系(共 28页) 4
1 线程对象
2009-7-29 北京理工大学计算机系(共 28页) 5
开发多线程程序最简单的方法
定义一个类,继承自 Thread类,重载其
public void run() 方法
实例,EraserThread.java
( 1)先看一下无线程情况
( 2)自定义一个 EraserThread类
( 3)主程序中启动线程
2009-7-29 北京理工大学计算机系(共 28页) 6
Thread类
提供了控制线程的几个方法
构造函数:
public Thread( String threadName )
public Thread()
重载 run方法,定义要以多线程方式完成的工作。
Sleep(),makes thread inactive
Interrupt(),interrupts a running thread
isAlive (),checks status of a thread
setName(),sets a thread’s name
Join():
– Waits for this thread to finish
– (等待本线程停止)
2009-7-29 北京理工大学计算机系(共 28页) 7
多线程第二种方法
一个类实现 java.lang.Runable接口即可,同样实现一个 public void run()方法,
实例,EraserDemo
更复杂的实例,ThreadTest
2009-7-29 北京理工大学计算机系(共 28页) 8
线程的生命周期
Thread的状态
– Born,(创建 )
Thread was just created
– Ready,(就绪 )
Thread’s start method invoked
Thread can now execute
– Running,(运行 )
Thread is assigned a processor and running
– Dead state,(死亡 )
Thread has completed or exited
Eventually disposed of by system
2009-7-29 北京理工大学计算机系(共 28页) 9
线程状态转换体现了一个线程的生命周期
2009-7-29 北京理工大学计算机系(共 28页) 10
线程状态转换示例
中断一个线程:
InterruptDemo.java
线程调用 Sleep进入睡眠状态,用
Interrupt方法中断它
需要仔细分析程序流程
2009-7-29 北京理工大学计算机系(共 28页) 11
线程组 (Thread Groups)
ThreadGroup类:
– 将一批线程做成一组统一管理
– 每一组线程组有一个唯一的名字
Java中的线程组可以有父子关系,
Method calls sent to parent group
also sent to child groups
ThreadGroup parent=new ThreadGroup(“parent”)
ThreadGroup child=new ThreadGroup(parent,”Child”)
2009-7-29 北京理工大学计算机系(共 28页) 12
向线程组中增加新线程
Thread t1=new
Thread(parent,”t1”)
Thread t2=new Thread(child,”t2”)
线程组提供以下方法,
stop suspend resume
2009-7-29 北京理工大学计算机系(共 28页) 13
线程组示例
ThreadGroupDemo
采用匿名类,为线程组重定义
uncaughtException()方法统一处理线程组中的未捕获异常
2009-7-29 北京理工大学计算机系(共 28页) 14
线程优先级 (Priority)
Java thread priority
– Priority in range 1-10
操作系统的 Timeslicing,根据优先级进行
2009-7-29 北京理工大学计算机系(共 28页) 15
线程调度策略
非抢占调度,英国的绅士风度,java中使用 Thread类的 yield()方法实现
抢占时间片调度,讲究公平
2009-7-29 北京理工大学计算机系(共 28页) 16
2 线程同步
2009-7-29 北京理工大学计算机系(共 28页) 17
Daemon线程
背景执行的线程,当主线程结束时自动结束
实例,DaemonThread
2009-7-29 北京理工大学计算机系(共 28页) 18
等待另一个线程的结束
A线程正在运行,希望插入一个 B线程,
要求 B先执行完毕,A才继续运行
使用 Join方法
Join的含义是:将某一线程加入成为另一个线程的流程之一。
2009-7-29 北京理工大学计算机系(共 28页) 19
join()
声明:
public final void join()
throws InterruptedException
功能:
Waits for this thread to die,
2009-7-29 北京理工大学计算机系(共 28页) 20
示例
示例,join
运行状况:
一定要等到 B线程完成了,
主线程后面的代码才执行
。
2009-7-29 北京理工大学计算机系(共 28页) 21
线程同步
示例,PersonalInfo
由于多个线程同时访问一个对象,造成程序错误
2009-7-29 北京理工大学计算机系(共 28页) 22
更正错误
加入 synchronized关键字于方法
setNameAndID之前
2009-7-29 北京理工大学计算机系(共 28页) 23
线程同步 (Synchronization)
Java 使用一个监视器 (monitors)来实现线程同步
synchronized关键字:
1,每一个具有 synchronized 方法的对象都自动拥有一个 monitor
2,一次只能有一个线程来执行这个方法
3,其余的线程阻塞,直到此方法执行完毕
4,当方法执行完毕,下一个最高优先级的线程运行
2009-7-29 北京理工大学计算机系(共 28页) 24
线程同步代码块
亦可使用
synchronized(Object){
//需要同步的代码
}
即将要访问此对象的代码放入到此同步块中,
2009-7-29 北京理工大学计算机系(共 28页) 25
线程同步实例分析
下面将介绍经典的,生产者 ---消费者,
问题,
生产者生产 10个数,消费者依次消费
10个数,生产者不生产数,消费者需等待,
消费者未消费数,生产者需等待
用多线程来实现
2009-7-29 北京理工大学计算机系(共 28页) 26
无同步时的情况
2009-7-29 北京理工大学计算机系(共 28页) 27
有同步时的情况
使用 wait等待,使用 notify通知
2009-7-29 北京理工大学计算机系(共 28页) 28
线程综合实例
下面的例子实现了一个 Applet,设计了一个实现 Runnable接口的自定义类,
然后,利用了 synchronized 实现三个线程的同时运行,并允许暂停。注意分析代码。