线程ppt
合集下载
多线程与高并发PPT模板

01 LongAdder
02 2DoubleAdder
03
超高并发使用,分为多个cell分别进行累加,get的时候将cell 的值加一起
LongAdder
将并发操作拆分到多个cell,提高 并发度 缓存行 细节
LongAdder
缓存行
单个cell为一个long的包装,使用了@sun.misc.Contended注解, 保证该long变量占用单独的一个缓存行
01
AtomicRefere nce
02
AtomicStamp edReference
引用类
AtomicReference AtomicStampedReference
可用来解决CAS的ABA问题 内部使用Pair将Reference和 stamp包装起来
atomic包
字段类
AtomicLon gFieldUpd ater
AtomicBoolean
atomic包
数组类
AtomicInte gerArray
AtomicLon gArray
AtomicRefe renceArray
数组类
AtomicIntegerArray AtomicLongArray AtomicReferenceArray
atomic包
引用类
02 notify不释放锁
03 流程
调用wait后将线程放入等待队列, 并释放当前锁 调用notify后,会把线程从等待 队列移动到阻塞队列,可重新竞 争锁
锁
lock
Reentra ntLock
Reentran tReadWr iteLock
Conditi on
Stampe dLock
Java程序设计课件:线程

sleep(int millsecond) join(long millis)
使线程休眠一段时间,时间长短由参数 millsecond决定,单位是毫秒。
等待该线程终止。等待该线程终止的时间最长
为 millis 毫秒。
10/35 2023/12/28
1 线程的启动
创建线程对象T t.start(); // 线程启动
时交出对象锁,从而其他线程就可以取得对 象锁。还可以使用如下格式指定线程的等待 时间。
wait(long timeout) wait(long timeout,int nanos)
notifyAll()方法 notify()方法
14/35 2023/12/28
线程组
线程组(Thread Group):是包括许多线程的对象 集,线程组拥有一个名字以及与它相关的一些属性, 可以用于管理一组线程。
11/35 2023/12/28
线程的调度
Java的线程调度策略:
多线程系统会自动为每个线程分配一个优先级,默认 时,继承父类的优先级。
优先级高的线程先执行,优先级低的线程后执行。 任务紧急的线程,其优先级较高。 优先级相同的线程,按先进先出的原则排队运行。 线程的优先级分为10级,在线程类Thread中,Java
对象锁:Java运行系统在执行具有保留字 synchronized声明的方法时,会为每个处于临界区 的对象分配唯一的对象锁。任何线程访问一个对象中 被同步的方法前,首先要取得该对象的对象锁;同步 方法执行完毕后,线程会释放对象的同步锁。
13/35 2023/12/28
线程间的通信
wait()方法: 方法wait()使得当前进程处于阻塞状态,同
3)该线程与另一个线程join在一起。
Java多线程技术PPT课件

Thread类的常用构造方法如下:
❖ public Thread(Runnable target) ❖ public Thread(String name)
9
2. 如何实现多线程? 2.1 Thread类和Runnable接口
Thread类有3个有关线程优先级的常量:
❖ Thread.MIN_PRIORITY=1; ❖ Thread.MAX_PRIORITY=10; ❖ Thread.NORM_PRIORITY=5;
学习提纲
1
1. 程序、进程和线程 1.1 程序、进程和线程
程 序 ( Program ) 是能完成预定功能的静 态的指令序列。
2
பைடு நூலகம்
1. 程序、进程和线程 1.1 程序、进程和线程
为提高操作系统的并行性和资源利用率,提出了进程(Process)的概 念。简单地说进程是程序的一次执行,进程是动态的。
为解决此问题,又提出了线程(Thread)的概念。将资源分配和处理器 调度的基本单位分离,进程只是资源分配的单位,线程是处理器调度的 基本单位。一个进程包含多个并发的线程。一个进程中的线程只能使用进
程的资源和环境。线程只包含程序计数器、栈指针及堆栈,不包含进程地址
空 间 的 代 码 和 数 据 , 因 此 线 程 被 称 为 轻 质 进 程 ( Light Weight Process)。线程提高了系统的整体性能和效率。
正在执行的线程休眠(暂停执行)。
11
2. 如何实现多线程? 2.1 Thread类和Runnable接口
Runnable接口在ng包中,定义如下:
❖ public interface Runnable
Runnable接口中只包含一个抽象方法:
❖ public Thread(Runnable target) ❖ public Thread(String name)
9
2. 如何实现多线程? 2.1 Thread类和Runnable接口
Thread类有3个有关线程优先级的常量:
❖ Thread.MIN_PRIORITY=1; ❖ Thread.MAX_PRIORITY=10; ❖ Thread.NORM_PRIORITY=5;
学习提纲
1
1. 程序、进程和线程 1.1 程序、进程和线程
程 序 ( Program ) 是能完成预定功能的静 态的指令序列。
2
பைடு நூலகம்
1. 程序、进程和线程 1.1 程序、进程和线程
为提高操作系统的并行性和资源利用率,提出了进程(Process)的概 念。简单地说进程是程序的一次执行,进程是动态的。
为解决此问题,又提出了线程(Thread)的概念。将资源分配和处理器 调度的基本单位分离,进程只是资源分配的单位,线程是处理器调度的 基本单位。一个进程包含多个并发的线程。一个进程中的线程只能使用进
程的资源和环境。线程只包含程序计数器、栈指针及堆栈,不包含进程地址
空 间 的 代 码 和 数 据 , 因 此 线 程 被 称 为 轻 质 进 程 ( Light Weight Process)。线程提高了系统的整体性能和效率。
正在执行的线程休眠(暂停执行)。
11
2. 如何实现多线程? 2.1 Thread类和Runnable接口
Runnable接口在ng包中,定义如下:
❖ public interface Runnable
Runnable接口中只包含一个抽象方法:
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()方法,使线程结束,进入消亡状态。
线程

内核级线程(2)
线程执行中可通过内核创建线程 原语来创建其他线程,这个应用 的所有线程均在一个进程中获得 支持。
内核要为整个进程及进程中的单 个线程维护现场信息,应在内核 中建立和维护PCB及TCB,内核的 调度是在线程的基础上进行的。
内核级线程主要优点
多处理器上,内核能同时调度同一 进程中多个线程并行执行。
用户 堆栈
用户 地址空间
系统 堆栈
用户地址空间 进程控制块
用户堆栈 系统堆栈
进程
管理者 执行序列
管理和执行相分离的进程模型
用户地址空间
进程控制块
管理者
执行序列
共享
执行控制
执行控制
执行序列
用户堆栈 系统堆栈
用户堆栈 系统堆栈
进程
多线程进程的内存布局
多线程进程模型
进程 控制块
用户 地址空间
线程1 线程控制块
进程和线程
⑵用多个相互独立的进程,每个进程负责 一个请求。
这种方案不会出现⑴的矛盾和浪费局面, 但是显然这些进程间需要大量的和复杂 的共享机制,而且需要大量的进程,每 个进程都需要占用一套完整的进程管理 信息,这些进程频繁地动态建立和撤消 ,频繁地进行进程切换。这些开销是很 大的,而考虑到这些进程处理的大部分 数据是相互共享的,运行的程序也是同 一个程序,这种开销就值得研究了。
进程和线程
可以看出上述在进程模型下的3种方案都不 能很好地解决和实现“基于同一数据空 间来处理多个请求”的需要。
线程模型正是为了更好地解决和实现这种 基于同一数据空间来处理多个请求”的 需要,而提出的。
为“同时多请求”服务的4种方 案
模
型
进 单进程顺序处理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
一、多线程原理和概念 2.多线程
public class ClassA { public static void main(String[] args) { while (true) { System.out.println(“hello!"); } while (true) { System.out.println(“你好!"); } } } 问题:这个程序的执行结果是什么?
OutThread1 outThread1 = new OutThread1(); OutThread2 outThread2 = new OutThread2(); outThread1.start(); outThread2.start();
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
Java的多线程机制
一、线程的创建与运行
二、线程常用方法
三、多线程应用 四、小结
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
一、多线程原理与概念
二、线程的运行过程
三、线程的状态与生命周期
四、创建线程的两种方式
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
一、多线程原理和概念 1.单线程
} catch (InterruptedException e) {}
}}
线程执行一次输出后,休眠500ms(毫秒),使自己放弃CPU 资源,500ms时间到后,重新排队等待接受CPU的调度
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
二、线程的运行过程 1. 程序中线程的运行过程分析:代码LeftAndRight.java
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
一、多线程原理和概念 3. 线程运行的理论原理
CPU的时间片 操作系统使用分时管理各个进程,按照时间片管理每个进 程。 操作系统每次分时给java程序一个时间片的CPU时间内, 在若干个独立的可控制线程之间切换。 CPU的执行时间被划分成大小相等的时间片
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
二、线程的运行过程 1. 程序中线程的运行过程分析:代码LeftAndRight.java
问题六:定义了其他线程的Java程序中,程序的执行结果是 固定的吗? 不是的,这取决于程序的流程和本机本次运行中CPU的调度 情况。
计算机科学与技术学院网络工程教研室
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
二、线程的运行过程 1. 程序中线程的运行过程分析:代码LeftAndRight.java
问题一:该程序中一共启动几个线程? 一共启动了三个线程:主线程main,其他线程right和left JVM加载代码时,发现main()方法,启动主线程,将CPU资 源给主线程,启动main()方法。主线程在获得CPU资源后,执 行了下面的操作,创建了线程left和right。 left=new Lefthand();//创建线程。 right=new Righthand(); left.start(); right.start(); 然后执行输出: for(int i=0;i<=6;i++){ System.out.println("我是主线程");}}
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
二、线程的运行过程 1. 程序中线程的运行过程分析:代码LeftAndRight.java
问题一:该程序中一共启动几个线程? 但是下面的输出不会全部执行完毕或者马上执行,为什么? for(int i=0;i<=6;i++){ System.out.println("我是主线程");} 问题二:每个线程都是如何被创建的? 线程left和right分别是通过Thread的子类Lefthand和 RightHand线程类来创建的。创建后left和right处于新建状态。
main() main() main() left.start() left right right.start() main() right left
CPU资源在主线程,left,right三个线程之间进行切换
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
二、线程的运行过程 1. 程序中线程的运行过程分析:代码LeftAndRight.java
问题五:每个线程是何时运行结束的? 主线程:创建好线程left和right,并完成输出 “我是主线程” 语句七次后,执行结束。 线程left:其run()方法中,完成输出“我是左手线程”语句九 次后,执行结束。 线程right:其run()方法中,完成输出“我是右手线程”语句 五次后,执行结束。
问题四:每个线程是如何被中断,将CPU资源给其他线程使 用的? 线程left和right在run()方法的执行中, public void run(){
for (int i = 1; i <= 9; i++) { System.out.println("我是左手线程"); try {
sleep(500);
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
一、多线程原理和概念 2.多线程
如何修改ClassA.java?使它按照两条输出路线进行内容的 输出?
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
一、多线程原理和概念 2.多线程
如何修改ClassA.java?使它按照两条输出路线进行内容的 输出? 思路: 定义两个线程类,每个线程负责一条输出: class OutThread1 extends Thread …… class OutThread2 extends Thread …… 在main()中启动两条线程
以往开发的程序都是单线程的,一个程序只有一条从头到 尾的执行线索。如 public class ClassA { public static void main(String[] args) { while (true) { System.out.println("hello"); } } 大多数程序在设计时习惯上从考虑使程序从头至尾一步步地 实现所有的功能入手,即使得一个程序只有一条执行路线。
一多线程原理和概念 2.多线程
掌握线程编程的几个关键之处: 理解线程运行的理论原理 理解程序中每条线程的生命周期 何时被创建,何时开始,何时(被)中断,何时继续执行, 何时结束? 线程中常用方法的功能、作用和编程技巧 start(),run(),sleep(),isAlive(),currentThread(),interrupt(),wai t(),notify(),notifyAll() 认真分析程序中每条线程的执行过程
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
三、线程的状态与生命周期 2.就绪状态
通过调用线程的start()方法,线程由新建状态变为就绪状态; left.start(); 由JVM管理线程left,排队等待CPU的使用权。
3.运行状态
JVM将CPU的使用权交给一个线程后,该线程进入运行状态, 调用其run()方法,执行线程操作的具体内容。 run()方法中定义了线程对象被调度后所执行的操作,是线程 获得CPU的使用权后系统自动调用的方法,不需用户程序引用。 run()定义了该线程的使命,是需要被重写覆盖父类的run()方 法的。
应用程序1
主线程 线程1 线程2
应用程序n
JVM
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
二、线程的运行过程 1. 程序中线程的运行过程分析:代码LeftAndRight.java
读程序LeftAndRight.java,回答下面的问题: 该程序中一共启动了几个线程? 每个线程都是如何被创建的? 每个线程是何时开始运行的? 每个线程是如何被中断将CPU资源给其他线程使用的? 每个线程是何时运行结束的? 定义了其他线程的Java程序中,程序的执行结果是固定的吗?
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
二、线程的运行过程 1. 程序中线程的运行过程分析:代码LeftAndRight.java
问题四:每个线程是如何被中断,将CPU资源给其他线程使 用的? 当JVM分配给三个线程中任何一个线程的时间片结束后,如 果该线程还没有运行结束,它也必须让出CPU资源给其他线程 使用,而本线程到JVM的等待队列中排队,等待JVM在下一次 调度中将CPU资源分配给该线程使用。
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
class Lefthand extends Thread { public void run() { ……}} ……LeftHand left = new Lefthand();
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
二、线程的运行过程 1. 程序中线程的运行过程分析:代码LeftAndRight.java
一、线程的创建与运行
三、线程的状态与生命周期 1. 新建状态
当一个Thread类或其子类的对象被声明并被创建时,新生的 线程对象处于新建状态。 LeftHand left=new Lefthand();//线程left处于新建状态。 已经分配了相应的内存空间和其他资源。但JVM管理的线程 队列中还没有这个线程。
问题三:每个线程是何时开始运行的? JVM首先将CPU资源给主线程,主线程的运行过程中创建了 其他线程left和right,当执行到下列语句时, left.start(); right.start(); 线程left和right进入到就绪状态 当JVM将CPU的使用权切换给线程left时,left对象中的run() 方法就立刻执行。 JVM将CPU的使用权在主线程,线程right和线程left之间切换。 每个线程都可以按照自己的执行路线向前执行……
一、线程的创建与运行
一、多线程原理和概念 2.多线程
public class ClassA { public static void main(String[] args) { while (true) { System.out.println(“hello!"); } while (true) { System.out.println(“你好!"); } } } 问题:这个程序的执行结果是什么?
OutThread1 outThread1 = new OutThread1(); OutThread2 outThread2 = new OutThread2(); outThread1.start(); outThread2.start();
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
Java的多线程机制
一、线程的创建与运行
二、线程常用方法
三、多线程应用 四、小结
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
一、多线程原理与概念
二、线程的运行过程
三、线程的状态与生命周期
四、创建线程的两种方式
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
一、多线程原理和概念 1.单线程
} catch (InterruptedException e) {}
}}
线程执行一次输出后,休眠500ms(毫秒),使自己放弃CPU 资源,500ms时间到后,重新排队等待接受CPU的调度
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
二、线程的运行过程 1. 程序中线程的运行过程分析:代码LeftAndRight.java
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
一、多线程原理和概念 3. 线程运行的理论原理
CPU的时间片 操作系统使用分时管理各个进程,按照时间片管理每个进 程。 操作系统每次分时给java程序一个时间片的CPU时间内, 在若干个独立的可控制线程之间切换。 CPU的执行时间被划分成大小相等的时间片
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
二、线程的运行过程 1. 程序中线程的运行过程分析:代码LeftAndRight.java
问题六:定义了其他线程的Java程序中,程序的执行结果是 固定的吗? 不是的,这取决于程序的流程和本机本次运行中CPU的调度 情况。
计算机科学与技术学院网络工程教研室
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
二、线程的运行过程 1. 程序中线程的运行过程分析:代码LeftAndRight.java
问题一:该程序中一共启动几个线程? 一共启动了三个线程:主线程main,其他线程right和left JVM加载代码时,发现main()方法,启动主线程,将CPU资 源给主线程,启动main()方法。主线程在获得CPU资源后,执 行了下面的操作,创建了线程left和right。 left=new Lefthand();//创建线程。 right=new Righthand(); left.start(); right.start(); 然后执行输出: for(int i=0;i<=6;i++){ System.out.println("我是主线程");}}
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
二、线程的运行过程 1. 程序中线程的运行过程分析:代码LeftAndRight.java
问题一:该程序中一共启动几个线程? 但是下面的输出不会全部执行完毕或者马上执行,为什么? for(int i=0;i<=6;i++){ System.out.println("我是主线程");} 问题二:每个线程都是如何被创建的? 线程left和right分别是通过Thread的子类Lefthand和 RightHand线程类来创建的。创建后left和right处于新建状态。
main() main() main() left.start() left right right.start() main() right left
CPU资源在主线程,left,right三个线程之间进行切换
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
二、线程的运行过程 1. 程序中线程的运行过程分析:代码LeftAndRight.java
问题五:每个线程是何时运行结束的? 主线程:创建好线程left和right,并完成输出 “我是主线程” 语句七次后,执行结束。 线程left:其run()方法中,完成输出“我是左手线程”语句九 次后,执行结束。 线程right:其run()方法中,完成输出“我是右手线程”语句 五次后,执行结束。
问题四:每个线程是如何被中断,将CPU资源给其他线程使 用的? 线程left和right在run()方法的执行中, public void run(){
for (int i = 1; i <= 9; i++) { System.out.println("我是左手线程"); try {
sleep(500);
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
一、多线程原理和概念 2.多线程
如何修改ClassA.java?使它按照两条输出路线进行内容的 输出?
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
一、多线程原理和概念 2.多线程
如何修改ClassA.java?使它按照两条输出路线进行内容的 输出? 思路: 定义两个线程类,每个线程负责一条输出: class OutThread1 extends Thread …… class OutThread2 extends Thread …… 在main()中启动两条线程
以往开发的程序都是单线程的,一个程序只有一条从头到 尾的执行线索。如 public class ClassA { public static void main(String[] args) { while (true) { System.out.println("hello"); } } 大多数程序在设计时习惯上从考虑使程序从头至尾一步步地 实现所有的功能入手,即使得一个程序只有一条执行路线。
一多线程原理和概念 2.多线程
掌握线程编程的几个关键之处: 理解线程运行的理论原理 理解程序中每条线程的生命周期 何时被创建,何时开始,何时(被)中断,何时继续执行, 何时结束? 线程中常用方法的功能、作用和编程技巧 start(),run(),sleep(),isAlive(),currentThread(),interrupt(),wai t(),notify(),notifyAll() 认真分析程序中每条线程的执行过程
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
三、线程的状态与生命周期 2.就绪状态
通过调用线程的start()方法,线程由新建状态变为就绪状态; left.start(); 由JVM管理线程left,排队等待CPU的使用权。
3.运行状态
JVM将CPU的使用权交给一个线程后,该线程进入运行状态, 调用其run()方法,执行线程操作的具体内容。 run()方法中定义了线程对象被调度后所执行的操作,是线程 获得CPU的使用权后系统自动调用的方法,不需用户程序引用。 run()定义了该线程的使命,是需要被重写覆盖父类的run()方 法的。
应用程序1
主线程 线程1 线程2
应用程序n
JVM
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
二、线程的运行过程 1. 程序中线程的运行过程分析:代码LeftAndRight.java
读程序LeftAndRight.java,回答下面的问题: 该程序中一共启动了几个线程? 每个线程都是如何被创建的? 每个线程是何时开始运行的? 每个线程是如何被中断将CPU资源给其他线程使用的? 每个线程是何时运行结束的? 定义了其他线程的Java程序中,程序的执行结果是固定的吗?
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
二、线程的运行过程 1. 程序中线程的运行过程分析:代码LeftAndRight.java
问题四:每个线程是如何被中断,将CPU资源给其他线程使 用的? 当JVM分配给三个线程中任何一个线程的时间片结束后,如 果该线程还没有运行结束,它也必须让出CPU资源给其他线程 使用,而本线程到JVM的等待队列中排队,等待JVM在下一次 调度中将CPU资源分配给该线程使用。
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
class Lefthand extends Thread { public void run() { ……}} ……LeftHand left = new Lefthand();
计算机科学与技术学院网络工程教研室
一、线程的创建与运行
二、线程的运行过程 1. 程序中线程的运行过程分析:代码LeftAndRight.java
一、线程的创建与运行
三、线程的状态与生命周期 1. 新建状态
当一个Thread类或其子类的对象被声明并被创建时,新生的 线程对象处于新建状态。 LeftHand left=new Lefthand();//线程left处于新建状态。 已经分配了相应的内存空间和其他资源。但JVM管理的线程 队列中还没有这个线程。
问题三:每个线程是何时开始运行的? JVM首先将CPU资源给主线程,主线程的运行过程中创建了 其他线程left和right,当执行到下列语句时, left.start(); right.start(); 线程left和right进入到就绪状态 当JVM将CPU的使用权切换给线程left时,left对象中的run() 方法就立刻执行。 JVM将CPU的使用权在主线程,线程right和线程left之间切换。 每个线程都可以按照自己的执行路线向前执行……