小伙伴们,我们分享继续哦

1.1 进程和线程

程序Program是一段静态的代码,它是应用程序执行的蓝本

进程Process是指一种正在运行的程序,有自己的地址空间

java在代码里面动态创建bean java 动态创建类_多线程

进程的特点

动态性

并发性

独立性

并发和并行的区别

并行:多个CPU同时执行多个任务

并发:一个CPU(采用时间片)同时执行多个任务

生活案例:并发和并行的区别

并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。

java在代码里面动态创建bean java 动态创建类_多线程_02

并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行

java在代码里面动态创建bean java 动态创建类_java 动态创建线程_03

线程Thread

•进程内部的一个执行单元,它是程序中一个单一的顺序控制流程。

•线程又被称为轻量级进程(lightweight process)

•如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为多线程

•线程特点

•轻量级进程

•独立调度的基本单位

•共享进程资源

java在代码里面动态创建bean java 动态创建类_阻塞状态_04

java在代码里面动态创建bean java 动态创建类_多线程_05

•可并发执行

•线程和进程的区别

java在代码里面动态创建bean java 动态创建类_就绪状态_06

生活案例:线程和进程的区别

班级:505,503,504

小组:1,2,3,4,5……

完成一件事情:大扫除

总负责:校长

步骤1:以班级为单位领取大扫除工具,本班级的所有小组都使用该班级领取的资源

步骤2:以小组为单位开始大扫除

步骤3:校长亲自监督,如果发现不合格,直接要求该小组重新打扫;如果某小组打扫完毕,校长可以直接给该小组安排其他任务

对比

CPU:校长

进程:班级  (一个班级可以有多个小组,班级是资源分配的单位)

线程:小组 (校长直接指挥小组进行工作)。

1.2线程定义和创建1:继承Thread类

•Thread类是Java提供的线程顶级类,继承Thread类可快速定义线程。

【示例1】 使用多线程实现龟兔赛跑

java在代码里面动态创建bean java 动态创建类_多线程_07

• run() 线程体,线程要完成的任务

•start() 启动线程,线程进入就绪队列,等待获取CPU并执行

•之前讲解的程序都是单线程的

第二节 线程的定义和创建

2.1 线程定义和创建2:实现Runnable接口

【示例2】使用多线程实现龟兔赛跑2

java在代码里面动态创建bean java 动态创建类_多线程_08

两种方式的优缺点

方式1:继承Thread类

缺点:Java单继承,无法继承其他类

优点:代码稍微简单

方式2:实现Runnable接口

优点  还可以去继承其他类 便于多个线程共享同一个资源

•  缺点:代码略有繁琐

实际开发中,方式2使用更多一些

•可以使用匿名内部类来创建线程对象

•已经学习的线程Thread的属性和方法

java在代码里面动态创建bean java 动态创建类_java 动态创建线程_09

java在代码里面动态创建bean java 动态创建类_阻塞状态_10

2.2 线程定义和创建3:实现Callable接口

JDK1.5后推出了第三种定义线程的方式,实现Callable接口

【示例3】使用多线程获取随机数

java在代码里面动态创建bean java 动态创建类_java 动态创建线程_11

第三种方式:实现Callable接口

与实行Runnable相比, Callable功能更强大些

•方法名不同

•可以有返回值,支持泛型的返回值

•可以抛出检查异常

•需要借助FutureTask,比如获取返回结果

Future接口

•可以对具体Runnable、Callable任务的执行结果进行取消、查询是否完成、获取结果等。

•FutrueTask是Futrue接口的唯一的实现类

•FutureTask 同时实现了Runnable, Future接口。它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值

2.3线程的生命周期

java在代码里面动态创建bean java 动态创建类_阻塞状态_12

•新生状态:

•用new关键字建立一个线程对象后,该线程对象就处于新生状态。

•处于新生状态的线程有自己的内存空间,通过调用start进入就绪状态

•就绪状态:

•处于就绪状态线程具备了运行条件,但还没分配到CPU,处于线程就绪队列,等待系统为其分配CPU

•当系统选定一个等待执行的线程后,它就会从就绪状态进入执行状态,该动作称之为“cpu调度”。

•运行状态:

•在运行状态的线程执行自己的run方法中代码,直到等待某资源而阻塞或完成任务而死亡。

•如果在给定时间片内没执行结束,就会被系统给换下来回到等待执行状态。

•阻塞状态:

处于运行状态的线程在某些情况下,如执行了sleep(睡眠)方法, 或等待I/O设备等资源,将让出CPU并暂时停止自己的运行,进入阻塞状态。

•在阻塞状态的线程不能进入就绪队列。只有当引起阻塞的原因消除时,如睡眠时间已到,或等待的I/O设备空闲下来,线程便转入就绪状态,重新到就绪队列中排队等待,被系统选中后从原来停止的位置开始继续运行。

•死亡状态:

•死亡状态是线程生命周期中最后一个阶段。线程死亡原因有三个。一个是正常运行的线程完成了它的全部工作;另一个是线程被强制性地终止,如通过执行stop方法来终止一个线程[不推荐使用】,三是线程抛出未捕获的异常

今天的分享就到这里了,我们待会见。