测试必备之Java知识(四)—— 线程相关
线程相关
Java多线程实现方式
继承Thread,实现Runnable接口,实现Callable接口(能抛异常且有返回值,不常用)
为什么有了继承Thread方式还要有Runnable接口方式
实现接口的方式适合多个相同程序代码的线程去处理同一个资源,可以避免Java中单继承的限制
为什么JVM启动是多线程的?
因为至少启动了两个线程:主线程、垃圾回收线程
线程和进程的含义
进程:是操作系统资源分配的基本单位,正在运行的程序
线程:是任务调度和执行的基本单位,程序使用CPU的最基本单位
多线程和多进程的含义
多进程:操作系统能同时运行多个任务即程序
多线程:同一程序中有多个顺序流在执行
并发和并行的含义
并行:逻辑上同时发生,一段时间内同时运行多个程序
并发:物理上同时发生,一个时间点同时运行多个程序
线程和进程的区别
| 不同点 | 进程 | 线程 |
| 一个进程里有多个线程 | ||
| 内存 | 不共享内存 | 共享内存 |
| 资源 | 进程间共享文件网络资源 | 线程间不共享 |
| 开销 | 进程需要分配内存,开销较大 | 线程只需要分配栈和一个PC,开销较小 |
| 独立 | 可以独立存在 | 可以独立,必须依赖进程而存在 |
| 作用 | 进程是CPU资源分配的最小单位 | 线程是CPU调度的最小单位 |
| 通信 | 进程间的通信比较复杂因为它的数据空间独立性,需要通过操作系统,基于socket的进程间的通信机制 | 而线程间的通信由于多线程共享地址空间和数据空间,可直接通信,不必通过操作系统(内核的调度) |
线程调度模型
分时调度模型:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间片
抢占式调度模型:优先让优先级高的线程使用CPU,获得CPU时间片也越多,Java使用此模型
线程间通信——生产者消费者模式
生产者:先看是否有数据,有就等待消费者消费(wait),没有就生产,生产完后通知消费者消费
消费者:先看是否有数据,有就消费,没有就等待生产者生产,通知生产者生产数据(notify)
Java线程调度方式
线程睡眠:Thread.sleep(long millis),使线程转换到阻塞状态,当睡眠结束后,就转为就绪状态
线程等待:Object.wait(),导致当前的线程等待,直到其他线程调用此对象的notify()或notifyAll()
线程唤醒:Object.notify()方法,唤醒在此对象上等待的单个线程。
线程让步:Thread.yield(),暂停当前正在执行的线程对象,把执行机会让给相同或更高优先级的线程
线程加入:join(),等待其他线程终止
线程状态
初始状态:创建一个线程
就绪状态:线程调用start()方法
运行状态:线程被CPU调度
阻塞状态:放弃CPU使用权,暂停完毕后变回就绪状态(同步阻塞,等待阻塞,其他阻塞)
死亡状态:线程执行完或因异常退出了run()方法,线程结束了生命周期
线程状态转换

测试必备之Java知识(四)—— 线程相关的更多相关文章
- 测试必备之Java知识(三)—— 集合、Map相关
集合相关 List.Set.Map的区别 类型 描述 List 允许重复对象,可插入多个null元素,有序 Set 不允许重复对象,只允许一个null元素,无序 Map 不是collection的子接 ...
- 测试必备之Java知识(二)—— Java高级的东西
Java高级 类加载过程 加载(创建class对象) -> 连接(验证-准备-解析) -> 类初始化 类加载器类别 根类加载器:加载java核心类 扩展类加载器:加载JRE目录中的jar包 ...
- 测试必备之Java知识(一)—— Java基础
Java基础 Java如何运行的? 开发的java源代码,通过javac编译成为平台无关的字节码文件(class),然后通过JVM的解释器将字节码解释成对应的机器码 “一次编译,到处运行”的理解 说的 ...
- Android开发学习必备的java知识
Android开发学习必备的java知识本讲内容:对象.标识符.关键字.变量.常量.字面值.基本数据类型.整数.浮点数.布尔型.字符型.赋值.注释 Java作为一门语言,必然有他的语法规则.学习编程语 ...
- 面试4——java进程和线程相关知识
1.线程和进程的概念.并行和并发的概念
- Java多线程(四) 线程池
一个优秀的软件不会随意的创建.销毁线程,因为创建和销毁线程需要耗费大量的CPU时间以及需要和内存做出大量的交互.因此JDK5提出了使用线程池,让程序员把更多的精力放在业务逻辑上面,弱化对线程的开闭管理 ...
- Java多线程(四) —— 线程并发库之Atomic
一.从原子操作开始 从相对简单的Atomic入手(java.util.concurrent是基于Queue的并发包,而Queue,很多情况下使用到了Atomic操作,因此首先从这里开始). 很多情况下 ...
- java 之Thread线程相关yield()、sleep()、wait()、join()、run和start方法详解
1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...
- 重学JAVA基础(四):线程的创建与执行
1.继承Thread public class TestThread extends Thread{ public void run(){ System.out.println(Thread.curr ...
随机推荐
- Roslyn 使用 WriteLinesToFile 解决参数过长无法传入
在写 Roslyn 的时候,经常需要辅助编译的工具,而这些工具需要传入一些参数,在项目很大的时候,会发现自己传入的参数比微软限制控制台可以传入的参数大很多,这时就无法传入了参数 本文告诉大家如何使用 ...
- linux进程 阻塞和非阻塞操作
在我们看全功能的 read 和 write 方法的实现之前, 我们触及的最后一点是决定何时使 进程睡眠. 有时实现正确的 unix 语义要求一个操作不阻塞, 即便它不能完全地进行下去. 有时还有调用进 ...
- Linux 内核 设备结构嵌入
设备结构包含设备模型核心需要的来模型化系统的信息. 大部分子系统, 但是, 跟踪关于 它们驻留的设备的额外信息. 结果, 对设备很少由空设备结构所代表; 相反, 这个结构, 如同 kobject 结构 ...
- 2019浙江ACM省赛——部分题目
有一些题目过了我还没有重新写,先放一些我重新写好了的吧 签到题拿到了信心吧,9分钟写完两题,我们贼开心,我大哥说签到题有什么好开心的,如果不是我有一些地方卡了下,可能还是更快吧,还有就是测试案例多试了 ...
- 22.re(正则表达式)
转载:https://www.cnblogs.com/yuanchenqi/article/5732581.html 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Pyt ...
- 记springboot + MP +Hikari动态数据源配置
环境准备: springboot 2.1.6 mybatis-plus 数据库驱动 boot 自带hikari驱动 步骤1: 导入多数据源启动工具类 <!-- 多数据源支持 -->< ...
- javascript DOM 编程艺术 札记2 平稳退化
定义 指的是即便浏览器不支持javascript,页面的基础展示功能也不会受到影响的做法. 不能平稳退化的实例 javascript:这种伪协议,它可以通过链接调用javascript函数.比如< ...
- layui treeSelect
官方地址:https://fly.layui.com/extend/treeSelect/ 下面介绍一下这个插件的使用方法 1.html页面 <div class="layui-inp ...
- $SP$3267 $DQUERY - D-query$ 主席树
正解:主席树 解题报告: 传送门! 一直在做$dp$题好久没做做别的了,,,所以来做点儿别的练练手,,,不然以前学的全忘了要/$kk$ 然后这题好像可以莫队/主席树/线段树/树状数组? 我就先只港下主 ...
- DRF 08
目录 三大认证 流程 认证组件 权限组件 频率组件 自定义token的签发 三大认证 流程 由于DRF中, 所有的视图类都要直接和间接继承APIView类, 也只有APIView类中才有dispatc ...