线程 JAVA 教程PPt
合集下载
《Java 2面向对象程序设计基础》线程ppt

一个线程将始终保持运行状态,直到出现下列情况:由于 I/O(或其他一些原因)而使该线程阻塞;调用sleep、wait、 join 或yield 方法也将阻塞该线程;更高优先级的线程将抢占 该线程;时间片的时间期满而退出运行状态或线程执行结束。
6.1.3 线程的优先级及其调度
【例6.3】综合使用线程的方法来控制线程的工作举例,程序如下。
多线程是指同一个应用程序中有多个顺序流同时执行。在一个程序中可 以同时运行多个不同的线程来执行不同的任务,各个线程并行地完成各 自的任务。浏览器就是一个典型的多线程例子。
6.1.2 线程的生命周期
每个Java程序都有一个默认的主线程。对于应用程序,主线 程是main()方法执行的路径。图6-1说明线程的生命周期及其 状态转换。
第6章 线程
(时间:3次课,6学时)
第6章 线程
教学提示:计算机世界要想真正地反映现实世界,必须 解决事情的同步问题,即解决程序实现多线程的问题。
因此可编写有几条执行路径的程序,使得程序能够同时 执行多个任务,借此实现多线程运行。Java语言的一大 特点就是内置对多线程的支持。
本章主要介绍:Java中的线程作用机制 、线程的实现方 法、线程的控制和线程的同步与死锁 。
message = msg;
iterations = iter;
}
public void run() {
for (int i=0; i<iterห้องสมุดไป่ตู้tions; i+=1) {
System.out.println(message);
try {
Thread.sleep(100);
6.1.3 线程的优先级及其调度
【例6.3】综合使用线程的方法来控制线程的工作举例,程序如下。
多线程是指同一个应用程序中有多个顺序流同时执行。在一个程序中可 以同时运行多个不同的线程来执行不同的任务,各个线程并行地完成各 自的任务。浏览器就是一个典型的多线程例子。
6.1.2 线程的生命周期
每个Java程序都有一个默认的主线程。对于应用程序,主线 程是main()方法执行的路径。图6-1说明线程的生命周期及其 状态转换。
第6章 线程
(时间:3次课,6学时)
第6章 线程
教学提示:计算机世界要想真正地反映现实世界,必须 解决事情的同步问题,即解决程序实现多线程的问题。
因此可编写有几条执行路径的程序,使得程序能够同时 执行多个任务,借此实现多线程运行。Java语言的一大 特点就是内置对多线程的支持。
本章主要介绍:Java中的线程作用机制 、线程的实现方 法、线程的控制和线程的同步与死锁 。
message = msg;
iterations = iter;
}
public void run() {
for (int i=0; i<iterห้องสมุดไป่ตู้tions; i+=1) {
System.out.println(message);
try {
Thread.sleep(100);
《JAVA多线程》PPT课件

21.
myThread
t1,t2,t3,t4;
22.
t1=new myThread("Thread 1");
23.
t2=new myThread("Thread 2");
24.
t3=new myThread("Thread 3");
25.
t4=new myThread("Thread 4");
26.
4.
number=num;
5.
System.out.println("创建线程:" +number);
6. }
7. public void run(){
8.
while(true){
9.
System.out.println("线程 " + number + ":计数 " + count);
10.
if(++count==6) return;
8.2.1 多线程编程中常用的常量和方法
Thread类包含的常量有:
–1. public static final int MAX_PRIORITY: 最大 优先级,值是10。
–2. public static final int MIN_PRIORITY: 最小 优先级,值是1。
–3. public static final int NORM_PRIORITY:缺省 优先级,值是5。
– isAlive( ) : 判断线程是否处于执行的状态,返回值true表 示处于运行状态,false表示已停止。
– start( ) :使调用该方法的线程开始执行。 – run( ) :该方法由start( )方法自动调用。
《Java多线程管理》PPT课件

•
a.setPriority(temp); //将线程优先级设置为默认
•
System.out.println(a.getPriority());
•
}
•}
2021/6/28
8
线程安全问题
• public class Piao { • public int num; • public Piao(int num){ • this.num = num; •} • public void sell(String name){ • if(num<=0){ • return; •} • System.out.println(name+"卖"+num); • try { • Thread.sleep(10); • } catch (InterruptedException e) { • e.printStackTrace(); •} • num=num-1; •} •}
b.setPriority(3); a.start(); b.start(); } }
2021/6/28
4
4
优先级应用二
•
class ThreadA extends Thread
•
{
•
public void run()
•
{
•
System.out.println("我是线程A");
•
}
•
}
•
•
class ThreadB extends Thread
2021/6/28
3
3
优先级应用一
• • • • • • •
高 • • • • •
10-java多线程PPT优秀课件

第十章 多线程
本讲内容
11.1 线程的概念 11.2 线程的状态 11.3 多线程编程 11.4 线程同步
2
11.1 线程的概念
人们常说做事情要一心一意,不能三心二意。 在现实世界中,其实很多事情可以并发执行的。比如,
人体在接受外界信息时,视觉、嗅觉、听觉、味觉、 触觉这些感知器官统统都是并发执行的。所谓眼观六 路、耳听八方。 随着科学技术的发展,计算机也进入了三心二意的时 代。大家在使用计算机的时候,可以同时运行两个甚 至两个以上的程序:比如一边听歌、一边上网看新闻, 还可以同时下载电影。
操作系统的进程并发机制可以帮助我们实现这一目的。
实际情况是由操作系统负责管理 CPU 等硬件资源的分 配,通过采用时间片原理,以非常小的时间间隔交替 执行多个程序。
因此,给我们大家一种多个程序被同时执行的错觉, 即并发执行。
上网 听歌
5
我们把支持并发执行的操作系统称为多任务操 作系统。
操作系统不仅要管理计算机的各个硬件资源 (例如CPU)的分配,还要管理软件的执行。
15
线程的生命周期
notify( )
CPU run( )
start( )
调度
sleep( )
stop( )
创建
就绪
运行
非运行
停止
wait( )
16
11.3 多线程编程
Java中有两种方法来创建一个新的线程:
➢ 继承 Thread 类 ➢ 实现 Runnable 接口
无论采用哪种方法,都要使用到Thread类及其 相关的方法。
Java与多线程
Java语言的一个重要特点就是对多线程的支持, 它使得编程人员可以很方便地开发出具有多线程 功能、能同时处理多个任务的应用程序。
本讲内容
11.1 线程的概念 11.2 线程的状态 11.3 多线程编程 11.4 线程同步
2
11.1 线程的概念
人们常说做事情要一心一意,不能三心二意。 在现实世界中,其实很多事情可以并发执行的。比如,
人体在接受外界信息时,视觉、嗅觉、听觉、味觉、 触觉这些感知器官统统都是并发执行的。所谓眼观六 路、耳听八方。 随着科学技术的发展,计算机也进入了三心二意的时 代。大家在使用计算机的时候,可以同时运行两个甚 至两个以上的程序:比如一边听歌、一边上网看新闻, 还可以同时下载电影。
操作系统的进程并发机制可以帮助我们实现这一目的。
实际情况是由操作系统负责管理 CPU 等硬件资源的分 配,通过采用时间片原理,以非常小的时间间隔交替 执行多个程序。
因此,给我们大家一种多个程序被同时执行的错觉, 即并发执行。
上网 听歌
5
我们把支持并发执行的操作系统称为多任务操 作系统。
操作系统不仅要管理计算机的各个硬件资源 (例如CPU)的分配,还要管理软件的执行。
15
线程的生命周期
notify( )
CPU run( )
start( )
调度
sleep( )
stop( )
创建
就绪
运行
非运行
停止
wait( )
16
11.3 多线程编程
Java中有两种方法来创建一个新的线程:
➢ 继承 Thread 类 ➢ 实现 Runnable 接口
无论采用哪种方法,都要使用到Thread类及其 相关的方法。
Java与多线程
Java语言的一个重要特点就是对多线程的支持, 它使得编程人员可以很方便地开发出具有多线程 功能、能同时处理多个任务的应用程序。
java多线程编程PPT课件

一、线程的概念
线程的状态与生命周期
每个线程都与生命周期相关联,一个生命周期含有多个可 以互相转换的状态,线程从产生到消亡的生命周期中要经历创 建、就绪、运行、阻塞和死亡五种状态。通过线程的控制与调 度可使线程在这几个状态间转换,每个Java程序中都拥有一个 与main方法对应的主线程,必须在主线程中创建新的线程。
(1)创建状态:当一个Thread类或其子类的对象被声明并创 建后,该线程对象就处于创建状态。创建状态是线程已经创建 但未开始执行的一个特殊状态。处于创建状态的线程只是一个 空的线程对象,系统不为它分配资源但有自己的内存空间,通 过调用start()方法进入就绪状态。
一、线程的概念
(2)就绪状态:处于就绪状态的线程已经具备运行条件但还未获得时间 片,因此进入线程队列,等待系统为其分配CPU。一旦获得CPU,该线程 便进入运行状态并自动调用自己的Run()方法。
(5)死亡状态:死亡状态是线程生命周期的最后一个阶段,表示线程已 经退出运行状态并且不再进入就绪队列。当线程的run()方法结束或由于其 它原因被终止后,线程便进入消亡状态。线程的终止分为两种形式:一是 自然死亡即线程的run()方法正常结束,二是强制终止线程,如调用destory() 或stop()命令终止线程。
public class ng.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语言基础课件线程

➢ 使用步骤
1. 实现run方法 2. 把新线程要做的事写在run方法中 3. 创建自定义的Runnable的子类对象创建Thread对象, 传入Runnable 4. 调用start()开启新线程, 内部会自动调用Runnable的run()方法
实现Runnable的原理(了解)
两种方式的区别 (掌握)
子线程 主线程
线程实现的方式 (1) - 继承Thread
➢ 使用步骤 1. 定义类继承Thread 2. 重写run方法 3. 把新线程要做的事写在run方法中 4. 创建线程对象 5. 开启新线程, 内部会自动执行run方法 注:这种方式只能调用start,内部会调用run方法
线程实现的方式 (2) - 定义类实现Runnable接口
Java命令会启动java虚拟机,启动JVM,等于启动了一个应用程序,也就是启动了一个进程。该进程会自动启 动一个 “主线程” ,然后主线程去调用某个类的 main 方法。
➢ JVM的启动是多线程的吗
JVM启动至少启动了垃圾回收线程和主线程,所以是多线程的。 案例:垃圾回收和主线程打印的顺序不一样,多线程是抢占资源
多线程的概念
➢ 什么是线程
线程是程序执行的一条路径, 一个进程中可以包含多条线程 一个应用程序可以理解成就是一个进程 多线程并发执行可以提高程序的效率, 可以同时完成多项工作
➢ 多线程的应用场景
VNC同时共享屏幕给多个电脑 迅雷开启多条线程一起下载 QQ同时和多个人一起视频 服务器同时处理多个客户端请求
注意:案例中线程给个小睡眠时间
加入线程、礼让线程、设置线程优先级(了解)
join(), 当前线程暂停, 等待指定的线程执行结束后, 当前线程再继续 join(int), 可以等待指定的毫秒之后继续 yield() 让出cpu setPriority()设置线程的优先级
1. 实现run方法 2. 把新线程要做的事写在run方法中 3. 创建自定义的Runnable的子类对象创建Thread对象, 传入Runnable 4. 调用start()开启新线程, 内部会自动调用Runnable的run()方法
实现Runnable的原理(了解)
两种方式的区别 (掌握)
子线程 主线程
线程实现的方式 (1) - 继承Thread
➢ 使用步骤 1. 定义类继承Thread 2. 重写run方法 3. 把新线程要做的事写在run方法中 4. 创建线程对象 5. 开启新线程, 内部会自动执行run方法 注:这种方式只能调用start,内部会调用run方法
线程实现的方式 (2) - 定义类实现Runnable接口
Java命令会启动java虚拟机,启动JVM,等于启动了一个应用程序,也就是启动了一个进程。该进程会自动启 动一个 “主线程” ,然后主线程去调用某个类的 main 方法。
➢ JVM的启动是多线程的吗
JVM启动至少启动了垃圾回收线程和主线程,所以是多线程的。 案例:垃圾回收和主线程打印的顺序不一样,多线程是抢占资源
多线程的概念
➢ 什么是线程
线程是程序执行的一条路径, 一个进程中可以包含多条线程 一个应用程序可以理解成就是一个进程 多线程并发执行可以提高程序的效率, 可以同时完成多项工作
➢ 多线程的应用场景
VNC同时共享屏幕给多个电脑 迅雷开启多条线程一起下载 QQ同时和多个人一起视频 服务器同时处理多个客户端请求
注意:案例中线程给个小睡眠时间
加入线程、礼让线程、设置线程优先级(了解)
join(), 当前线程暂停, 等待指定的线程执行结束后, 当前线程再继续 join(int), 可以等待指定的毫秒之后继续 yield() 让出cpu setPriority()设置线程的优先级
java学习第10章PPT教学课件

由调度程序调用,当run()方法返回时, 该线程停止
使调用它的线程立即停止执行
使线程睡眠n毫秒,n毫秒后,线程可以 再次运行
使线程挂起,暂停运行Not Runnable
恢复挂起的线程,使处于可运行状态 Runnable
将CPU控制权主动移交到下一个可运行 线程
2、Thread类的主要方法
setName(String) getName() getPriority() setPriority(int) join()
赋予线程一个名字
取得由setName()方法设置的线程名字的 字符串
返回线程优先级
设置线程优先级
当前线程等待调用该方法的线程结束后, 再往下执行
setDaemon(boole an )
设置该线程是daemon线程还是用户线程, Daemon线程也称服务线程,通常编 成无限循环,在后台持续运行。
例10-1 直接继承Thread类实现多线程
第10章 多线程机制
1.1 Java线程的概念 1.2 Java多线程编程方法 1.3 线程的控制 1.4 线程资源的同步处理
1.多进程
多进程的缺点: • 进程切换开销大; • 进程间的通信很不方便。
2.多线程
• 多线程则指的是在单个程序中可以同时运行多个 不同的线程,执行不同的任务
• 线程切换的开销小 。
例10-2 计数按钮的设计
import java.applet.*; import java.awt.*; class countbutton extends Button implements Runnable {
int count=0; public countbutton(String s) { super(s); } public void run() {
使调用它的线程立即停止执行
使线程睡眠n毫秒,n毫秒后,线程可以 再次运行
使线程挂起,暂停运行Not Runnable
恢复挂起的线程,使处于可运行状态 Runnable
将CPU控制权主动移交到下一个可运行 线程
2、Thread类的主要方法
setName(String) getName() getPriority() setPriority(int) join()
赋予线程一个名字
取得由setName()方法设置的线程名字的 字符串
返回线程优先级
设置线程优先级
当前线程等待调用该方法的线程结束后, 再往下执行
setDaemon(boole an )
设置该线程是daemon线程还是用户线程, Daemon线程也称服务线程,通常编 成无限循环,在后台持续运行。
例10-1 直接继承Thread类实现多线程
第10章 多线程机制
1.1 Java线程的概念 1.2 Java多线程编程方法 1.3 线程的控制 1.4 线程资源的同步处理
1.多进程
多进程的缺点: • 进程切换开销大; • 进程间的通信很不方便。
2.多线程
• 多线程则指的是在单个程序中可以同时运行多个 不同的线程,执行不同的任务
• 线程切换的开销小 。
例10-2 计数按钮的设计
import java.applet.*; import java.awt.*; class countbutton extends Button implements Runnable {
int count=0; public countbutton(String s) { super(s); } public void run() {
第2章Java多线程应用ppt课件全

线程将停止运行。休眠时间的长短由sleep( )方法的参数决定。 • public void run( ) •{ •… • //进行其他处理后 • Thread.sleep(200); //休眠时间以ms为单位 •}
2
• 2. join( ) • join( )方法使当前正在执行的线程进入等待状态(挂起),直至方法join( )所调用
• 2.1 线程和多线程 • 2.2 实例1 Java程序的多线程机制 • 2.3 实例2 Java程序中的多线程实现 • 2.4 实例3 基于Java语言的多线程同步机制 • 2.5实例4 用Java语言实• 线程(thread)是指计算机正在执行的程序中的一个控制流程。线程本 身不是完整程序,没有执行的入口,也没有出口,因此其自身不能自 动运行,而必须栖身于某一进程之中,由进程触发执行。
•
try //睡眠一随机时间,让出处理器
•
{Thread.sleep((int)(Math.random()*50));}
及在这段时间内线程能完成的任务,在线程的生命周期中有四种状态,通过对线程进 行操作来改变其状态。 • 1.创建状态 • 创建了一个线程而还没有启动它,则处于创建状态,此时仅是一个空的线程对象,并 不获得应有资源,只有启动后,系统才为它分配资源。处于创建状态的线程可以进行 两种操作:一是通过调用start()方法启动,使其进入可运行状态;二是调用stop()方法, 使其进入消亡状态。 • 2.可运行状态 • 在线程的创建状态中进行启动操作,则此线程进入可运行状态。可运行状态只说明该 线程具备了运行的条件,但并不一定是运行状态,因为在单处理器系统中运行多线程 程序,实际上在每个“时刻”至多有一个线程在运行,而系统中可能有多个线程都处 于运行状态,系统通过快速切换和调度使所有可运行的线程共享处理器,造成宏观上 的多线程并发运行。在可运行状态,线程运行的是线程体,线程体由run()方法规定, 在自己定义的线程类中重写。 • 在可运行状态下可进行多种操作:调用suspend()方法,使线程挂起,从而进入不可运 行状态;调用sleep()方法,使线侱睡眠,从而进入不可运行状态;调用wait()方法,使线 程等待,从而进入不可运行状态;调用yield()方法,使线程退让,使线程把CPU控制权 提前交给同级优先权的其他线程;调用stop()方法,使线程终止,从而进入消亡状态。正 常的情况下是执行完run()方法,使线程结束,进入消亡状态。
2
• 2. join( ) • join( )方法使当前正在执行的线程进入等待状态(挂起),直至方法join( )所调用
• 2.1 线程和多线程 • 2.2 实例1 Java程序的多线程机制 • 2.3 实例2 Java程序中的多线程实现 • 2.4 实例3 基于Java语言的多线程同步机制 • 2.5实例4 用Java语言实• 线程(thread)是指计算机正在执行的程序中的一个控制流程。线程本 身不是完整程序,没有执行的入口,也没有出口,因此其自身不能自 动运行,而必须栖身于某一进程之中,由进程触发执行。
•
try //睡眠一随机时间,让出处理器
•
{Thread.sleep((int)(Math.random()*50));}
及在这段时间内线程能完成的任务,在线程的生命周期中有四种状态,通过对线程进 行操作来改变其状态。 • 1.创建状态 • 创建了一个线程而还没有启动它,则处于创建状态,此时仅是一个空的线程对象,并 不获得应有资源,只有启动后,系统才为它分配资源。处于创建状态的线程可以进行 两种操作:一是通过调用start()方法启动,使其进入可运行状态;二是调用stop()方法, 使其进入消亡状态。 • 2.可运行状态 • 在线程的创建状态中进行启动操作,则此线程进入可运行状态。可运行状态只说明该 线程具备了运行的条件,但并不一定是运行状态,因为在单处理器系统中运行多线程 程序,实际上在每个“时刻”至多有一个线程在运行,而系统中可能有多个线程都处 于运行状态,系统通过快速切换和调度使所有可运行的线程共享处理器,造成宏观上 的多线程并发运行。在可运行状态,线程运行的是线程体,线程体由run()方法规定, 在自己定义的线程类中重写。 • 在可运行状态下可进行多种操作:调用suspend()方法,使线程挂起,从而进入不可运 行状态;调用sleep()方法,使线侱睡眠,从而进入不可运行状态;调用wait()方法,使线 程等待,从而进入不可运行状态;调用yield()方法,使线程退让,使线程把CPU控制权 提前交给同级优先权的其他线程;调用stop()方法,使线程终止,从而进入消亡状态。正 常的情况下是执行完run()方法,使线程结束,进入消亡状态。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
static int MAX_PRIORITY static int MIN_PRIORITY static int NORM_PRIORITY
线程的优先级及调度管理
线程的调度策略
线程调度器选择优先级最高的线程运行。但 是,如果发生以下情况,就会终止线程的运 行。
线程体中调用了yield()方法,让出了对CPU的占用 权 线程体中调用了sleep()方法, 使线程进入睡眠状 态 线程由于I/O操作而受阻塞 另一个更高优先级的线程出现。 在支持时间片的系统中,该线程的时间片用完。
Thread类的子类来创建线程
class MyThread1 extends Thread { public MyThread1(String str){ super(str); } public void run(){ ........ } } class Caller() { public static void main(String[] args) { new MyThread("May 1st").start(); } }
线程同步Synchronized
synchronized关键字可以作为函数的修饰符, 也可作为函数内的语句,也就是平时说的 同步方法和同步语句块。 无论synchronized关键字加在方法上还是对 象上,它取得的锁都是对象,而不是把一 段代码或函数当作锁――而且同步方法很 可能还会被其他线程的对象访问。
线程的常用方法
interrupt()
经常用来“吵醒”休眠的线程。 例题8-8
getName()
返回该线程的名称。
setName(String name)
改变线程名称,使之与参数 name 相同。
isAlive()
测试线程是否处于活动状态。
currentThread()
返回当前正在使用CPU资源的线程
例题8-3
用Runnable接口来创建线程
定义线程类实现Runnable接口 Thread myThread = new Thread(target); //target为Runnable接口类型 Runnable中有一个方法:public void run();用以定 义线程运行体 使用Runnable接口可以为多个线程提供共享的 数据 在实现Runnable接口的类的run()方法定义中可 以使用Thread的静态方法public static Thread currentThread();获取当前线程的引用
两种实现方式的区别和联系:
在程序开发中只要是多线程以实现 Runnable接口为主,因为实现Runnable接 口相比继承Thread类有如下好处:
避免点继承的局限,一个类可以实现多个接口。 适合于资源的共享。
Runnable接口和Thread之间的联系:
public class Thread extends Object implements Runnable
线程的概念
进程与线程
每个进程都有一段专用的内存区域 线程可共享相同的内存单元(包括代码和数据)
多进程:在操作系统中能同时运行多个任 务(程序); 多线程:在同一个应用程序中有多个顺序流 同时执行 多线程的目的是为了最大限度的利用CPU 资源。
Java的线程
Java应用程序总是从主类的main方法开始执行。 当JVM加载代码,发现main方法之后,就会启动 一个线程,这个线程称作“主线程”,该线程负 责执行main方法。那么,在main方法中再创建的 线程,就称为主线程中的线程。 每个线程都是通过某个特定Thread对象所对应的 方法run()来完成其操作的,方法run()称为线程体, 通过调用Thread类的start()方法来启动一个线程。
public ThreadTest implements Runnable{ public synchronized void run(){ for(int i=0;i<10;i++) { System.out.println(" " + i); } } public static void main(String[] args) { ThreadTest r1 = new ThreadTest(); ThreadTest r2 = new ThreadTest(); Thread t1 = new Thread(r1); Thread t2 = new Thread(r2); // Thread t2 = new Thread(r1); t1.start(); t2.start(); } }
线程的常用方法
sleep(int millsecond)
sleep()可以使低优先级的线程得到执行的机会,当然 也可以让同优先级、高优先级的线程有执行的机会。 并不释放对象锁。也就是如果有Synchronized同步块, 其他线程仍然不同访问共享数据。注意该方法要捕获 异常
yield()
与sleep()类似,只是不能由用户指定暂停多长时间, 并且yield()方法只能让同优先级的线程有执行的机会。
线程的常用方法
join()
使调用该方法的线程在此之前执行完毕,也就 是等待调用该方法的线程执行完毕后再往下继 续执行。注意该方法也要捕获异常。 在一定意义上,它可以实现同步的功能。
例joinTest.java 例8-13
classThread下的常用函数
suspend()、resume()
通过suspend()函数,可使线程进入停滞状态。 通过suspend()使线程进入停滞状态后,除非收 到resume()消息,否则该线程不会变回可执行 状态。 当调用suspend()函数后,线程不会释放它的 “锁标志”。
Interrupt()
图11.1 线程的生命周期与线程的状态
例8-1 例8-2
线程的优先级及调度管理
优先级:在多线程系统中,每个线程都被赋予一 个执行优先级。优先级决定了线程被CPU执行的优 先顺序。 线程的优先级设置遵从以下原则
线程创建时,子进程继承父进程的优先级 线程创建后,可通过调用setPriority()方法改变优 先级。 Java线程的优先级:取值范围是1~10
用Runnable接口来创建线程
class TestThread2 implements Runnable { public void run(){ ........ } } class Caller(){ public static void main(String[] args){ MyThread2 test = new MyThread2(); new Thread(test).start();// } }
Java的线程
JVM在主线程和其他线程之间轮流切换, 保证每个线程都有机会使用CPU资源, main方法即使执行完最后的语句,JVM也 不会结束我们的程序,JVM一直要等到主 线程中的所有线程都结束之后,才结束我 们的Java应用程序。
线程的生命周期
新建线程在它的一个完整的生命周期内通 常要经历四种状态。通过线程的控制与调 度可使线程在这几种状态间转化: 新建状态 运行状态 中断状态 死亡状态
线程
线程的基本概念 线程的创建和启动 线程的常用方法 线程的同步机制
Synchronized wait()、notify()、notifyAll() 、 、
线程的概念
程序、进程、线程
程序:(Program)是一段静态的代码,它是应用 软件执行的蓝本。 进程(Process)是程序的一次执行过程,是系统 运行程序的基本单位。 线程(Thread) 是比进程更小的执行单位。相当 于一个任务中的一条执行路径。
例ThreadTicket.java与RunnableTicket.java
Runnable接口与目标对象
使用同一目标对象的线程共享目标对象的 成员变量
例8-4 例8-5
关于run方法中的局部变量
不同线程的run方法中的局部变量互不干扰, 一个线程改变了自己的run方法中局部变量 的值不会影响其他线程的run方法中的局部 变量。
线程的创建和启动
Java中实现多线程的方法有两种,一种是 继承ng包中的Thread类,二是用户 在定义自己的类中实现Runnable接口。
Thread类的子类来创建线程
定义一个Thread的子类并重写其run方法如: class MyThread extends Thread { public void run() {...} } 生成该类的对象: MyThread myThread = new MyThread();
例MyTest.java
线程同步Synchronized
由于同一进程的多个线程共享同一片存储空间, 在带来方便的同时,也带来了访问冲突这个严重 的问题。Java语言提供了专门机制以解决这种冲 突,有效避免了同一个数据对象被多个线程同时 访问。 每个对象都有一个锁标志,当一个线程访问该对 象时,被Synchronized修饰的数据将被“上锁”, 阻止其他线程访问。当前线程访问完这部分数据 后释放锁标志,其他线程就可以访问了。
synchronized关键字同步方法
synchronized关键字同步静态方法: synchronized static StaticMethod{…} 作用域:某个类的范围,防止多个线程同 时访问这个类中的synchronized static 方法。 它可以对类的所有对象实例起作用。
注意
synchronized关键字不能继承。 在定义接口方法时不能使用synchronized关键字。 构造方法不能使用synchronized关键字 (synchronized块来进行同步)。 Synchronized的位置
线程同步Synchronized
每个对象只有一个锁(lock)与之相关联 实现同步是要很大的系统开销作为代价的, 甚至可能造成死锁,所以尽量避免无谓的 同步控制。
线程的优先级及调度管理
线程的调度策略
线程调度器选择优先级最高的线程运行。但 是,如果发生以下情况,就会终止线程的运 行。
线程体中调用了yield()方法,让出了对CPU的占用 权 线程体中调用了sleep()方法, 使线程进入睡眠状 态 线程由于I/O操作而受阻塞 另一个更高优先级的线程出现。 在支持时间片的系统中,该线程的时间片用完。
Thread类的子类来创建线程
class MyThread1 extends Thread { public MyThread1(String str){ super(str); } public void run(){ ........ } } class Caller() { public static void main(String[] args) { new MyThread("May 1st").start(); } }
线程同步Synchronized
synchronized关键字可以作为函数的修饰符, 也可作为函数内的语句,也就是平时说的 同步方法和同步语句块。 无论synchronized关键字加在方法上还是对 象上,它取得的锁都是对象,而不是把一 段代码或函数当作锁――而且同步方法很 可能还会被其他线程的对象访问。
线程的常用方法
interrupt()
经常用来“吵醒”休眠的线程。 例题8-8
getName()
返回该线程的名称。
setName(String name)
改变线程名称,使之与参数 name 相同。
isAlive()
测试线程是否处于活动状态。
currentThread()
返回当前正在使用CPU资源的线程
例题8-3
用Runnable接口来创建线程
定义线程类实现Runnable接口 Thread myThread = new Thread(target); //target为Runnable接口类型 Runnable中有一个方法:public void run();用以定 义线程运行体 使用Runnable接口可以为多个线程提供共享的 数据 在实现Runnable接口的类的run()方法定义中可 以使用Thread的静态方法public static Thread currentThread();获取当前线程的引用
两种实现方式的区别和联系:
在程序开发中只要是多线程以实现 Runnable接口为主,因为实现Runnable接 口相比继承Thread类有如下好处:
避免点继承的局限,一个类可以实现多个接口。 适合于资源的共享。
Runnable接口和Thread之间的联系:
public class Thread extends Object implements Runnable
线程的概念
进程与线程
每个进程都有一段专用的内存区域 线程可共享相同的内存单元(包括代码和数据)
多进程:在操作系统中能同时运行多个任 务(程序); 多线程:在同一个应用程序中有多个顺序流 同时执行 多线程的目的是为了最大限度的利用CPU 资源。
Java的线程
Java应用程序总是从主类的main方法开始执行。 当JVM加载代码,发现main方法之后,就会启动 一个线程,这个线程称作“主线程”,该线程负 责执行main方法。那么,在main方法中再创建的 线程,就称为主线程中的线程。 每个线程都是通过某个特定Thread对象所对应的 方法run()来完成其操作的,方法run()称为线程体, 通过调用Thread类的start()方法来启动一个线程。
public ThreadTest implements Runnable{ public synchronized void run(){ for(int i=0;i<10;i++) { System.out.println(" " + i); } } public static void main(String[] args) { ThreadTest r1 = new ThreadTest(); ThreadTest r2 = new ThreadTest(); Thread t1 = new Thread(r1); Thread t2 = new Thread(r2); // Thread t2 = new Thread(r1); t1.start(); t2.start(); } }
线程的常用方法
sleep(int millsecond)
sleep()可以使低优先级的线程得到执行的机会,当然 也可以让同优先级、高优先级的线程有执行的机会。 并不释放对象锁。也就是如果有Synchronized同步块, 其他线程仍然不同访问共享数据。注意该方法要捕获 异常
yield()
与sleep()类似,只是不能由用户指定暂停多长时间, 并且yield()方法只能让同优先级的线程有执行的机会。
线程的常用方法
join()
使调用该方法的线程在此之前执行完毕,也就 是等待调用该方法的线程执行完毕后再往下继 续执行。注意该方法也要捕获异常。 在一定意义上,它可以实现同步的功能。
例joinTest.java 例8-13
classThread下的常用函数
suspend()、resume()
通过suspend()函数,可使线程进入停滞状态。 通过suspend()使线程进入停滞状态后,除非收 到resume()消息,否则该线程不会变回可执行 状态。 当调用suspend()函数后,线程不会释放它的 “锁标志”。
Interrupt()
图11.1 线程的生命周期与线程的状态
例8-1 例8-2
线程的优先级及调度管理
优先级:在多线程系统中,每个线程都被赋予一 个执行优先级。优先级决定了线程被CPU执行的优 先顺序。 线程的优先级设置遵从以下原则
线程创建时,子进程继承父进程的优先级 线程创建后,可通过调用setPriority()方法改变优 先级。 Java线程的优先级:取值范围是1~10
用Runnable接口来创建线程
class TestThread2 implements Runnable { public void run(){ ........ } } class Caller(){ public static void main(String[] args){ MyThread2 test = new MyThread2(); new Thread(test).start();// } }
Java的线程
JVM在主线程和其他线程之间轮流切换, 保证每个线程都有机会使用CPU资源, main方法即使执行完最后的语句,JVM也 不会结束我们的程序,JVM一直要等到主 线程中的所有线程都结束之后,才结束我 们的Java应用程序。
线程的生命周期
新建线程在它的一个完整的生命周期内通 常要经历四种状态。通过线程的控制与调 度可使线程在这几种状态间转化: 新建状态 运行状态 中断状态 死亡状态
线程
线程的基本概念 线程的创建和启动 线程的常用方法 线程的同步机制
Synchronized wait()、notify()、notifyAll() 、 、
线程的概念
程序、进程、线程
程序:(Program)是一段静态的代码,它是应用 软件执行的蓝本。 进程(Process)是程序的一次执行过程,是系统 运行程序的基本单位。 线程(Thread) 是比进程更小的执行单位。相当 于一个任务中的一条执行路径。
例ThreadTicket.java与RunnableTicket.java
Runnable接口与目标对象
使用同一目标对象的线程共享目标对象的 成员变量
例8-4 例8-5
关于run方法中的局部变量
不同线程的run方法中的局部变量互不干扰, 一个线程改变了自己的run方法中局部变量 的值不会影响其他线程的run方法中的局部 变量。
线程的创建和启动
Java中实现多线程的方法有两种,一种是 继承ng包中的Thread类,二是用户 在定义自己的类中实现Runnable接口。
Thread类的子类来创建线程
定义一个Thread的子类并重写其run方法如: class MyThread extends Thread { public void run() {...} } 生成该类的对象: MyThread myThread = new MyThread();
例MyTest.java
线程同步Synchronized
由于同一进程的多个线程共享同一片存储空间, 在带来方便的同时,也带来了访问冲突这个严重 的问题。Java语言提供了专门机制以解决这种冲 突,有效避免了同一个数据对象被多个线程同时 访问。 每个对象都有一个锁标志,当一个线程访问该对 象时,被Synchronized修饰的数据将被“上锁”, 阻止其他线程访问。当前线程访问完这部分数据 后释放锁标志,其他线程就可以访问了。
synchronized关键字同步方法
synchronized关键字同步静态方法: synchronized static StaticMethod{…} 作用域:某个类的范围,防止多个线程同 时访问这个类中的synchronized static 方法。 它可以对类的所有对象实例起作用。
注意
synchronized关键字不能继承。 在定义接口方法时不能使用synchronized关键字。 构造方法不能使用synchronized关键字 (synchronized块来进行同步)。 Synchronized的位置
线程同步Synchronized
每个对象只有一个锁(lock)与之相关联 实现同步是要很大的系统开销作为代价的, 甚至可能造成死锁,所以尽量避免无谓的 同步控制。