小伙伴们,我们分享继续哦
第一节进程和线程
https://www.bilibili.com/video/BV137411V7Y1/?p=195
1.1 进程和线程
程序Program是一段静态的代码,它是应用程序执行的蓝本
进程Process是指一种正在运行的程序,有自己的地址空间
进程的特点
动态性
并发性
独立性
并发和并行的区别
并行:多个CPU同时执行多个任务
并发:一个CPU(采用时间片)同时执行多个任务
生活案例:并发和并行的区别
并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。
并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行
线程Thread
•进程内部的一个执行单元,它是程序中一个单一的顺序控制流程。
•线程又被称为轻量级进程(lightweight process)
•如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为多线程
•线程特点
•轻量级进程
•独立调度的基本单位
•共享进程资源
•可并发执行
•线程和进程的区别
生活案例:线程和进程的区别
班级:505,503,504
小组:1,2,3,4,5……
完成一件事情:大扫除
总负责:校长
步骤1:以班级为单位领取大扫除工具,本班级的所有小组都使用该班级领取的资源
步骤2:以小组为单位开始大扫除
步骤3:校长亲自监督,如果发现不合格,直接要求该小组重新打扫;如果某小组打扫完毕,校长可以直接给该小组安排其他任务
对比
CPU:校长
进程:班级 (一个班级可以有多个小组,班级是资源分配的单位)
线程:小组 (校长直接指挥小组进行工作)。
1.2线程定义和创建1:继承Thread类
•Thread类是Java提供的线程顶级类,继承Thread类可快速定义线程。
【示例1】 使用多线程实现龟兔赛跑
• run() 线程体,线程要完成的任务
•start() 启动线程,线程进入就绪队列,等待获取CPU并执行
•之前讲解的程序都是单线程的
第二节 线程的定义和创建
2.1 线程定义和创建2:实现Runnable接口
【示例2】使用多线程实现龟兔赛跑2
两种方式的优缺点
方式1:继承Thread类
缺点:Java单继承,无法继承其他类
优点:代码稍微简单
方式2:实现Runnable接口
优点 还可以去继承其他类 便于多个线程共享同一个资源
• 缺点:代码略有繁琐
实际开发中,方式2使用更多一些
•可以使用匿名内部类来创建线程对象
•已经学习的线程Thread的属性和方法
2.2 线程定义和创建3:实现Callable接口
JDK1.5后推出了第三种定义线程的方式,实现Callable接口
【示例3】使用多线程获取随机数
第三种方式:实现Callable接口
与实行Runnable相比, Callable功能更强大些
•方法名不同
•可以有返回值,支持泛型的返回值
•可以抛出检查异常
•需要借助FutureTask,比如获取返回结果
Future接口
•可以对具体Runnable、Callable任务的执行结果进行取消、查询是否完成、获取结果等。
•FutrueTask是Futrue接口的唯一的实现类
•FutureTask 同时实现了Runnable, Future接口。它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值
2.3线程的生命周期
•新生状态:
•用new关键字建立一个线程对象后,该线程对象就处于新生状态。
•处于新生状态的线程有自己的内存空间,通过调用start进入就绪状态
•就绪状态:
•处于就绪状态线程具备了运行条件,但还没分配到CPU,处于线程就绪队列,等待系统为其分配CPU
•当系统选定一个等待执行的线程后,它就会从就绪状态进入执行状态,该动作称之为“cpu调度”。
•运行状态:
•在运行状态的线程执行自己的run方法中代码,直到等待某资源而阻塞或完成任务而死亡。
•如果在给定时间片内没执行结束,就会被系统给换下来回到等待执行状态。
•阻塞状态:
处于运行状态的线程在某些情况下,如执行了sleep(睡眠)方法, 或等待I/O设备等资源,将让出CPU并暂时停止自己的运行,进入阻塞状态。
•在阻塞状态的线程不能进入就绪队列。只有当引起阻塞的原因消除时,如睡眠时间已到,或等待的I/O设备空闲下来,线程便转入就绪状态,重新到就绪队列中排队等待,被系统选中后从原来停止的位置开始继续运行。
•死亡状态:
•死亡状态是线程生命周期中最后一个阶段。线程死亡原因有三个。一个是正常运行的线程完成了它的全部工作;另一个是线程被强制性地终止,如通过执行stop方法来终止一个线程[不推荐使用】,三是线程抛出未捕获的异常
今天的分享就到这里了,我们待会见。