JUC并发编程01-基础概念

概念

进程

进程可以视为程序的一个实例,进程就是用来加载指令、管理内存、管理I0

线程

一个进程内可以有多个线程,一个线程就是一个指令流。

        在Java中,线程作为最小调度单位,进程作为资源分配的最小单位,可以说进程是线程的一个容器。

对比
  • 进程基本上相互独立,而线程存在于进程中,进程拥有共享资源,如内存空间,供其内部的线程共享。
  • 进程间通信较为复杂,线程的通信相对简单,可以通过同一个进程的共享资源实现
  • 线程更轻量,线程上下文切换成本一般要比进程上下文切换低。
并发

任务调度器将cpu的时间片(windows下时间片最小约为15ms)分给不同线程使用。(微观串行,宏观并行)

异步调用
  • 从方法调度的角度:不需要等待结果返回,就能继续进行。
  • 多线程可以放方法执行变成异步的,如果在项目中需要读取磁盘文件、视频文件转化等,可以开启一个新线程处理视频转化,避免堵塞主线程。
  • tomcat的异步servlet也是类似的目的,让用户线程处理耗时较长的操作,避免阻塞tomcat工作线程。
new Thread(()-> FileReader.read()).start()

创建线程

创建和运行线程【匿名内部类方式创建】

方法一:用Thread创建线程:需要重写run方法

//创建线程
Thread t = new Thread(){@Overridepublic void run(){}
};
//给线程起名
t.setName("t1");
//启动线程
t1.start();

方法二:使用Runnable配合Thread(更推荐使用)

把线程和任务(要执行的代码)分开,让代码更为灵活。

Runnable r = new Runnable(){@Overridepublic void run(){}
};Thread t2 = new Thread(r,"t2");t2.start();

Thread与Runnable的关系

  • 用Runnable更容易与线程池等高级API配合。
  • 用Runnable让任务类脱离了Thread继承体系,是种组合的方式,更灵活。

方法三:FutureTask配合Thread

  • FutureTask能够接收Callable类型的参数,用来处理有返回结果的情况。
  • FutureTask是个实现类,实现了RunnableFuture接口,间接实现了Runable接口,并比Runable接口多了一个Future接口。
//创建futureTask对象
FutureTask<Integer> task = new FutureTask<>(new Callable<Integer>{@Overridepublic Integer call() throws Exception {return null;}
});
//创建线程
Thread t3 = new Thread(task,"t3");
//启动线程
t3.start();
//获取返回值
task.get();

线程运行

查看和杀死进程

Windows

tasklist 查看进程 taskkill杀死进程

linux

ps命令 (添加grep命令可以更方便的查找) 查看进程

kill 杀死进程

top命令 查看进程信息(每隔一段时间重新采集) top -H -p  4262 查看java进程中的线程信息

线程运行
  • jps命令查看所有Java进程
  • jstrck<PID>查看某个Java进程(PID)的所有线程状态
  • jconsole查看某个Java进程中线程的运行情况(图像界面)

线程运行原理

栈帧debug
  • 每个线程启动后,虚拟机就会为其分配一块栈内存。
  • 每个栈由多个栈帧组成,对应着每次方法调用时所占用的内存。
  • 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法。

上下文切换

由于一些原因导致cpu不再执行当前的线程,转而执行另一个线程的代码。

  • 线程的cpu时间片用完
  • 垃圾回收(所有工作线程暂停,由垃圾回收的线程进行垃圾回收)
  • 有更高优先级的线程需要运行
  • 线程自己调用了sleep、yield、wait、join、park、synchronized、lock等方法。

        当上下文切换发生时,需要由操作学习通保持当前线程的状态,并恢复另一个线程的状态,Java中对应的概念就是程序计数器,它的作用时记住下一条jvm指令的执行地址,是线程私有的。(每个线程有自己的程序计数器)

  • 状态包括程序计数器、虚拟机栈中每个栈帧的信息,如局部遍历、操作数栈、返回地址等。
  • 上下文切换频繁会影响cpu性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/48440.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql数据库第二次作业

(1)显示所有职工的基本信息。 mysql> select * from t_worker; (2)查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。 mysql> select distinct department_id from t_worker; (3)求出所有职工的人数。 mysql> select count(1) from t_worker; (4)列…

Figma 中文版指南:获取和安装汉化插件

Figma是一种主流的在线团队合作设计工具&#xff0c;也是一种基于 Web 端的设计工具。在当今的设计时代&#xff0c;Figma 的使用满足了每个人的设计需求&#xff0c;不仅可以实现在线编辑&#xff0c;还可以方便日常管理&#xff0c;有效提高工作效率。然而&#xff0c;相信很…

分页查询与分页条件查询

--------------- 无PageHelper插件分页查询 1.创建PageBean实体类 Data NoArgsConstructor AllArgsConstructor public class PageBean<T> {private Long total;//总条数private List<T> items;//当前页数据集合 }类型安全性 泛型&#xff1a;提供了编译时的类型…

【Apache Doris】周FAQ集锦:第 15 期

【Apache Doris】周FAQ集锦&#xff1a;第 15 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户…

JMeter:BeanShell到JSR223迁移中的注意事项

前言 在之前的文章JMeter&#xff1a;BeanShell向JSR223迁移过程遭遇的java标准库不可用问题-如何切换JDK版本中引用了一段使用BeanShell对入参进行加密的脚本&#xff0c;迁移到JSR223&#xff0c;虽然更换JDK后编译通过&#xff0c;看似也可以执行了&#xff0c;但是其实那段…

windows USB 设备驱动开发-开发Type C接口的驱动程序(二)

编写 USB Type C 连接器驱动程序 在以下情况下&#xff0c;需要编写 USB Type-C 连接器驱动程序&#xff1a; 如果 USB Type-C 硬件能够处理电源输送 (PD) 状态机。 否则&#xff0c;请考虑编写 USB Type C 端口控制器驱动程序&#xff1b; 如果硬件没有嵌入式控制器。 否则&…

(10)深入理解pandas的核心数据结构:DataFrame高效数据清洗技巧

目录 前言1. DataFrame数据清洗1.1 处理缺失值&#xff08;NaNs&#xff09;1.1.1 数据准备1.1.2 读取数据1.1.3 查找具有 null 值或缺失值的行和列1.1.4 计算每列缺失值的总数1.1.5 删除包含 null 值或缺失值的行1.1.6 利用 .fillna&#xff08;&#xff09; 方法用Portfolio …

Python本地安装whl文件详解与高级pip命令技巧

有些情况我们pip一下包的时候会报错&#xff0c;可能因为延时或许其他不兼容的情况&#xff0c;这时候我们可以通过去网上下载该包的原文件&#xff0c;进行本地物理pip &#xff0c;在安装网上下载的whl之前&#xff0c;先明白不同后缀的差异&#xff1b;whl下载网址&#xff…

解答word图标变白

把WPS卸载了之后就变成白色了&#xff0c;然后在注册表中把word的地址改成office word的地址之后图标变成这样了&#xff0c;怎么办 1.winR打开命令提示符 2.输入regedit&#xff0c;打开注册表编辑器 3.找到下面这个路径 计算机\HKEY_CLASSES_ROOT\Word.Document.8\Defaul…

【C#】已知有三个坐标点:P0、P1、P2,当满足P3和P4连成的一条直线 与 P0和P1连成一条直线平行且长度一致,该如何计算P3、P4?

问题描述 已知有三个坐标点&#xff1a;P0、P1、P2&#xff0c;当满足P3和P4连成的一条直线 与 P0和P1连成一条直线平行且长度一致&#xff0c;该如何计算P3、P4&#xff1f; 解决办法 思路一&#xff1a;斜率及点斜式方程 # 示例坐标 x0, y0 1, 1 # P0坐标 x1, y1 4, 4 # …

自适应键盘,自带隐藏键盘的输入框(UITextField)

引言 在iOS开发中&#xff0c;输入框占据着举足轻重的地位。与安卓不同&#xff0c;iOS输入框经常面临键盘遮挡的问题&#xff0c;或者无法方便地取消键盘。为了解决这些问题&#xff0c;有许多针对iOS键盘管理的库&#xff0c;如IQKeyboardManager、TPKeyboardAvoiding和Keyb…

分库分表 [ 技术 ] 指南 ✨

目录 ✨探索 技术 分库分表✨ 数据库分库分表指南 一、什么是分库分表 二、分库分表策略 三、分库分表的实现 四、分库分表的常见问题及解决方案 五、总结 相关面试题目 1. 解释什么是数据库分库分表&#xff0c;以及它的主要目的是什么&#xff1f; 2. 描述垂直分库…

STM32学习(1)--STM32介绍

STM32介绍 1.STM32简介2.ARM3.STM32F103C8T64.外设5.命名规则6.系统结构7.引脚定义8.启动配置9.最小系统电路10.新建工程步骤11.工程架构 课程知识及代码来源均来自b站 江协科技&#xff0c;下学期即将做毕设&#xff0c;需要用到STM32单片机&#xff0c;在这个假期我将持续学…

摸鱼大数据——Spark Structured Steaming——新零售数据分析案例

1、数据源介绍 数据内容 字段说明 2、分析需求 数据清洗需求 清洗需求&#xff1a;1) 将客户id&#xff08;CustomerID&#xff09;不为0的数据保留下来: CustomerID ! 02) 将商品描述&#xff08;Description&#xff09;不为空的数据保留下来: Description !3) 将日期&#…

gds-linkqueue:泛型链式队列

类似于C的queue的泛型容器&#xff0c;初始化、销毁、清空、入队、出队、取队首/尾、队空。 ​​​​​​​ ​​​​​​​

对某次应急响应中webshell的分析

文章前言 在之前处理一起应急事件时发现攻击者在WEB应用目录下上传了webshell&#xff0c;但是webshell似乎使用了某种加密混淆手法&#xff0c;无法直观的看到其中的木马连接密码&#xff0c;而客户非要让我们连接webshell来证实此文件为后门文件且可执行和利用(也是很恼火&a…

fMATLAB中fill函数填充不同区域

只需获取填充区域的边缘信息&#xff0c;函数边缘越详细越好&#xff0c;然后调用fill函数。 fill函数能够根据指定的顶点坐标和填充颜色来绘制多边形或曲线形状&#xff0c;并在其内部填充指定的颜色。这使得在MATLAB中创建具有视觉吸引力的图形变得简单而高效。 fill函数的…

《0基础》学习Python——第二十讲__网路爬虫/<3>

一、用post请求爬取网页 同样与上一节课的get强求的内容差不多&#xff0c;即将requests.get(url,headershead)代码更换成requests.post(url,headershead),其余的即打印获取的内容&#xff0c;如果content-typejson类型的&#xff0c;打印上述代码的请求&#xff0c;则用一个命…

笔记:现代卷积神经网络之VGG

本文为李沐老师《动手学深度学习》笔记小结&#xff0c;用于个人复习并记录学习历程&#xff0c;适用于初学者 神经网络架构设计的模块化 然AlexNet证明深层神经网络卓有成效&#xff0c;但它没有提供一个通用的模板来指导后续的研究人员设计新的网络。 在下面的几个章节中&a…

【Vue】`v-if` 指令详解:条件渲染的高效实现

文章目录 一、v-if 指令概述二、v-if 的基本用法1. 基本用法2. 使用 v-else3. 使用 v-else-if 三、v-if 指令的高级用法1. 与 v-for 一起使用2. v-if 的性能优化 四、v-if 的常见应用场景1. 表单验证2. 弹窗控制 五、v-if 指令的注意事项 Vue.js 是一个用于构建用户界面的渐进式…