进程和线程,线程实现的几种基本方法
什么是进程?
我们这里学习进程是为了后面的线程做铺垫的。
一个程序运行起来,在操作系统中,就会出现对应的进程。简单的来说,一个进程就是跑起来的应用程序。
在电脑上我们可以通过任务管理器可以看到,跑起来的应用程序有哪些,同时也是每一个的进程。
在操作系统中,我们常常使用PCB这样的结构体来描述进程,pcb中包含了许多重要的信息,此处不做过多的讨论。
在pcb中最核心的就是,其中包括了很多的内存指针,该指针,会根据操作系统的操作来指向所要进行的资源。
如图:

上图就是,关于操作系统的流程(cpu,pcb,硬件等)。
在一个cpu中包括了很多的核心,一个核心只能进行一个进程。一个核心在不同的时刻可以进行不同的进程。
在这里pcb也提供许多的属性。
1.状态
就绪状态:就如同生活中随叫随到的这种状态,称为就绪状态。
阻塞状态:简单来说就是发生了阻塞,不能及时使用。
2.优先级
优先级:对一个程序的资源分配不均衡,消耗的时间有多有少,这种存在优先级的。
3.上下文
上下文:这里的上下文就如同字面的意思,上下要对应,不能逻辑不通。
4.记账信息
记账信息:这里延续了上面的优先级,因为分配资源的问题,我们这里要用表格来记录。
以上的几种属性就是pcb支持进程调度的几种属性。
线程的叙述和在idea上的实现方法
我们这里引入线程就是为了解决,进程创建开销比较大的问题。
线程开销比较小,会省很大的成本。
一个进程包括了多个线程。一个cpu的核可以运行多个线程。
线程具有并行和并发两种特性。
并行:就是指同一时刻可以进行多个任务。
并发:就是指不同的线程可以同时进行。
线程的实现
第一种方法:自己写一个类继承Thread类,重写run方法。
如代码:
package thread;
class MyThread extends Thread{@Overridepublic void run() {for(int i = 0; i < 100; i++){System.out.println("hello Thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
public class Deom1{public static void main(String[] args) {Thread t = new MyThread();t.start();for (int j = 0; j < 100; j++){System.out.println("hello main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
如代码我们可以看到,上面有两个打印,我们来看一下效果。
如图:

我们可以看到,上面的结果打印是间断的不是连续的,所以这里可以说明,线程是并发执行的。
这上面的run方法就是该线程要执行的东西。
第二种方法:实现Runnable 。
如代码:
package thread;
class MyRunnable implements Runnable{@Overridepublic void run() {for(int i = 0; i < 100; i++){System.out.println("hello Thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
public class Dome2 {public static void main(String[] args) {Thread t = new Thread(new MyRunnable());t.start();for (int j = 0; j < 100; j++){System.out.println("hello main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
这里的结果和上面的结果是一样的。
这里在实列t对象的时候,直接new的一个Thread ,里面又new的自己写的类,这样实现的,这个接口里面,包含了Thread的run方法。
第三种方法:运用匿名内部类
如代码:
package thread;public class Deom3 {public static void main(String[] args) {Thread t = new Thread() {@Overridepublic void run() {for(int i = 0; i < 100; i++){System.out.println("hello Thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}};t.start();for (int j = 0; j < 100; j++){System.out.println("hello main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
这里呢我们new的Thread相当于一个匿名的子类。
重写了run方法。
其运行的结果和第一种是一样的。
第四种方法:lambda表达式
如代码:
package thread;public class Deome4 {public static void main(String[] args) {Thread t = new Thread(()-> {for(int i = 0; i < 100; i++){System.out.println("hello Thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();for (int j = 0; j < 100; j++){System.out.println("hello main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
这里的lambda表达式,就相当于一个匿名的函数,用完就丢,平替了重写的run方法。
其运行结果和第一种一样。
在这所有的方法上面我们都使用了sleep方法,目的是让打印速度减慢,可以看到并发的效果。
以上就是线程的几种的实现方法。后面还会学习其他的。
相关文章:
进程和线程,线程实现的几种基本方法
什么是进程? 我们这里学习进程是为了后面的线程做铺垫的。 一个程序运行起来,在操作系统中,就会出现对应的进程。简单的来说,一个进程就是跑起来的应用程序。 在电脑上我们可以通过任务管理器可以看到,跑起来的应用程…...
【PyTorch】解决PyTorch安装中torch.cuda.is_available()返回False的问题
最近在安装PyTorch时遇到torch.cuda.is_available() False的问题,特此记录下解决方法,以帮助其他遇到相同问题的人。 问题描述 Ubuntu 20.04,3060 Laptop,安装了CUDA 11.4,在Anaconda下新建了Python 3.8的环境&…...
95% 的公司面临 API 安全问题
API 对企业安全发挥着关键作用,但绝大多数企业都为此遭受日益严重的安全风险。据安全公司 Fastly最近做的一项调查显示,84% 的受访企业缺乏足够的API安全措施,95%的企业在过去1年中遇到过 API 安全问题。 此外,79%的受访企业出于A…...
mysql的基本知识点-排序和分组
分组(GROUP BY) GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。例如,假设你有一个包含销售数据的表,并且你想按产品类别计算总销售额。你可以使用 GROUP BY 和 SUM() 函数来实现这一点。 SELECT…...
使用uniapp 的 plus.sqlite 操作本地数据库报错:::table xxx has no column named xxxx
背景: 1、使用uniapp 的 plus.sqlite 进行APP本地数据库操作 2、SQLite 模块用于操作本地数据库文件,可实现数据库文件的创建,执行SQL语句等功能。 遇到:在之前创建的表上进行新增字段的操作时候,出现问题:…...
第十五届蓝桥杯模拟赛 第三期 (C++)
第二次做蓝桥模拟赛的博客记录,可能有很多不足的地方,如果大佬有更好的思路或者本文中出现错误,欢迎分享思路或者提出意见 题目A 请问 2023 有多少个约数?即有多少个正整数,使得 2023 是这个正整数的整数倍。 答案&…...
Linux中的常用基础操作
ls 列出当前目录下的子目录和文件 ls -a 列出当前目录下的所有内容(包括以.开头的隐藏文件) ls [目录名] 列出指定目录下的子目录和文件 ls -l 或 ll 以列表的形式列出当前目录下子目录和文件的详细信息 pwd 显示当前所在目录的路径 ctrll 清屏 cd…...
【SpringMVC】知识汇总
SpringMVC 短暂回来,有时间就会更新博客 文章目录 SpringMVC前言一、第一章 SpingMVC概述二、SpringMVC常用注解1. Controller注解2. RequestMapping注解3. ResponseBody注解4. RequestParam5. EnableWebMvc注解介绍6. RequestBody注解介绍7. RequestBody与RequestP…...
android13实现切换导航模式功能
支持android13以上系统,需要系统签名。 public class NavigationHelper {/*** 设置导航模式** param context* param mode GESTURAL:手势 TWOBUTTON:二按钮 THREEBUTTON:三按钮*/public static void setNavigationMode(Contex…...
Pycharm服务器配置python解释器并结合内网穿透实现公网远程开发
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
vue3+vite+Electron构建跨平台应用
1.搭建第一个 electron-vite 项目 electron-vite 是一个新型构建工具,旨在为 Electron 提供更快、更精简的开发体验。它主要由五部分组成: 一套构建指令,它使用 Vite 打包你的代码,并且它能够处理 Electron 的独特环境,包括 Node.js 和浏览器环境。 集中配置主进程、渲染…...
学习次模函数-第1章 引言
许多组合优化问题可以被转换为集合函数的最小化,集合函数是在给定基集合的子集的集合上定义的函数。同样地,它们可以被定义为超立方体的顶点上的函数,即,其中是基集合的基数-它们通常被称为伪布尔函数[27]。在这些集合函数中&…...
实在数字员工,助力菜鸟智慧物流高效腾飞,领航行业新高度
秉承人人都有一个智能助理的发展愿景,自2023年首个数字员工落地以来,菜鸟数字员工累计运行时长已达10万小时。 在智能物流科技不断飞速迭代的今天,物流行业作为社会经济运行的重要支柱和电子商务生态链的关键环节,面临着前所未…...
【from PIL import Image】PIL库和Image的功能及用法
from PIL import Image代码 from PIL import Image 是 Python 中导入 PIL 库中的 Image 模块。PIL 是 Python Imaging Library 的缩写,它是 Python 中用于图像处理的一个强大的库。而 Image 模块则是 PIL 库中的一个子模块,提供了处理图像的各种功能。 …...
【python从入门到精通】--第一战:安装python
🌈 个人主页:白子寰 🔥 分类专栏:python从入门到精通,魔法指针,进阶C,C语言,C语言题集,C语言实现游戏👈 希望得到您的订阅和支持~ 💡 坚持创作博文…...
MySQL的利用分区功能将数据存储到不同的磁盘
MySQL支持将不同的分区存储在不同的磁盘或目录上,这可以进一步优化I/O性能和存储利用率。具体的操作步骤如下: 首先需要确保MySQL的数据目录配置允许在不同目录存储数据文件。在MySQL配置文件(my.cnf或my.ini)中添加以下配置项: [mysqld] innodb_file_per_table1 这个配置项…...
KDB+Q | D1 | 学习资源 基础数据类型
官网会是主要的学习资源:https://code.kx.com/q/ 中文教程可能读起来会快一点: https://kdbcn.gitee.io/ 参考了还不错的学习经验帖:https://www.jianshu.com/p/488764d42627 KDB擅长处理时序数据, KDB数据库是后端数据库&…...
中等职业学校大数据课程建设方案
大数据产业是以数据及数据所蕴含的信息价值为核心生产要素,通过数据技术、数据产品、数据服务等形式,使数据与信息价值在各行业经济活动中得到充分释放的赋能型产业。 大数据产业定义一般分为核心业态、关联业态、衍生业态三大业态。 一、专…...
.NET 依赖注入和配置系统
文章目录 依赖注入DI几个概念.NET 中使用DI生命周期IServiceProvider的服务定位器方法 配置系统Json文件配置绑定类读取配置 依赖注入 依赖注入(Dependency Injection,DI)是控制反转(Inversion of Control,IOC…...
什么是”法兰“?
“法兰”,第一次听说这个词,怪怪的,后来就知道了和“鲁棒”是一类人才发明的词; 所以就知道这个词原本是“flange”; 那这样就好解释了, 【 使物体更加坚固或(如火车车轮)保持正确…...
3步解决Windows视频播放难题:LAV Filters开源解码器终极方案
3步解决Windows视频播放难题:LAV Filters开源解码器终极方案 【免费下载链接】LAVFilters LAV Filters - Open-Source DirectShow Media Splitter and Decoders 项目地址: https://gitcode.com/gh_mirrors/la/LAVFilters 你是否曾经遇到过这样的尴尬场景&…...
城通网盘下载慢到心碎?这个开源工具让你1秒获取高速直连地址
城通网盘下载慢到心碎?这个开源工具让你1秒获取高速直连地址 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 你是否曾经遇到过这样的情况:从城通网盘下载一个重要的学习资料&…...
3个核心优势让Dell G15用户彻底解决散热控制难题:开源替代方案性能优化指南
3个核心优势让Dell G15用户彻底解决散热控制难题:开源替代方案性能优化指南 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 当你的Dell G15游戏本在…...
别再死记硬背了!用MONAI Transform处理医学图像,这5个实战场景帮你一次搞懂
医学图像处理实战:5个MONAI Transform核心场景解析 医学影像AI开发中最令人头疼的环节,往往不是模型设计,而是数据预处理。我曾见过不少团队花费80%的时间在数据清洗和转换上,却依然难以构建标准化的处理流程。MONAI Transform的出…...
潮玩盲盒小程序开发踩坑?这些解法要记住
潮玩盲盒小程序开发踩坑?这些解法要记住✅ 哈喽~做潮玩盲盒小程序开发,很多伙伴都会踩坑!今天整理了高频开发痛点对应应对方法,新手也能避坑👇 🎮 开发痛点应对方案(一痛一解&#x…...
新手必看:AI人脸隐私卫士从部署到使用,完整操作指南
新手必看:AI人脸隐私卫士从部署到使用,完整操作指南 1. 引言:为什么需要AI人脸隐私保护? 在日常生活中,我们经常需要分享照片到社交媒体或工作群聊。但你是否想过,这些照片中可能无意间暴露了他人的隐私信…...
MQTT(消息队列遥测传输)
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种轻量级、基于发布/订阅模式的消息传输协议,专为受限设备、低带宽、高延迟、不稳定网络的物联网通信设计的。MQTT诞生于1999年,目的是用最小的网…...
终极指南:深入理解Wing语言Preflight和Inflight执行阶段
终极指南:深入理解Wing语言Preflight和Inflight执行阶段 【免费下载链接】wing A programming language for the cloud ☁️ A unified programming model, combining infrastructure and runtime code into one language ⚡ 项目地址: https://gitcode.com/gh_mi…...
Changelog.com贡献指南:如何参与这个活跃的开源项目
Changelog.com贡献指南:如何参与这个活跃的开源项目 【免费下载链接】changelog.com Changelog is news and podcast for developers. This is our open source platform. 项目地址: https://gitcode.com/gh_mirrors/ch/changelog.com Changelog.com是一个使…...
LeetCode 二叉搜索树双神题通关!有序数组转平衡 BST + 验证 BST,小白递归一把梭
前言 二叉搜索树(BST)是算法刷题的高频必考知识点!今天给大家带来两道最经典、最基础的 BST 题目,全程用最简单的递归实现,代码干净、思路直白,不用死记硬背,看完就能直接写! 一道教…...
