java 动态创建线程_零基础学Java之JavaSE,第七课多线程,进程线程和线程的定义创建...

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

第一节进程和线程

https://www.bilibili.com/video/BV137411V7Y1/?p=195

1.1 进程和线程

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

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

进程的特点

动态性

并发性

独立性

并发和并行的区别

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

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

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

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

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

线程Thread

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

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

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

•线程特点

•轻量级进程

•独立调度的基本单位

•共享进程资源a50c9c6613be9ec65b7be210a449fc65.png

05ad6f99f9a5cd73e2cf3a82ddd748e4.png

•可并发执行

•线程和进程的区别e61839be228fa515c24576b06770f4c6.png

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

班级:505,503,504

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

完成一件事情:大扫除

总负责:校长

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

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

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

对比

CPU:校长

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

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

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

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

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

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

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

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

第二节 线程的定义和创建

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

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

两种方式的优缺点

方式1:继承Thread类

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

优点:代码稍微简单

方式2:实现Runnable接口

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

•  缺点:代码略有繁琐

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

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

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

6cb892aab6e4fdc9db0300716ee03e63.png

13e5f7285029bcbdc1dd45dfadc25270.png

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

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

【示例3】使用多线程获取随机数9e18ab6c59161019d42e672e2a9fd319.png

第三种方式:实现Callable接口

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

•方法名不同

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

•可以抛出检查异常

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

Future接口

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

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

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

2.3线程的生命周期cf22dac5e49a943228f69a047f10d067.png

•新生状态:

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

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

•就绪状态:

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

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

•运行状态:

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

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

•阻塞状态:

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

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

•死亡状态:

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值