进程和线程,线程实现的几种基本方法

 什么是进程?


  我们这里学习进程是为了后面的线程做铺垫的。

一个程序运行起来,在操作系统中,就会出现对应的进程。简单的来说,一个进程就是跑起来的应用程序。

在电脑上我们可以通过任务管理器可以看到,跑起来的应用程序有哪些,同时也是每一个的进程。


在操作系统中,我们常常使用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方法,目的是让打印速度减慢,可以看到并发的效果。

以上就是线程的几种的实现方法。后面还会学习其他的。

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

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

相关文章

redis在springboot项目中的应用

一&#xff0c;将查询结果放到redis中作为缓存&#xff0c;减轻mysql的压力。 只有在数据量大的时候&#xff0c;查询速度慢的时候才有意义。 本次测试的数据量为百万级别。 测试代码: 功能为根据昵称进行模糊匹配。 GetMapping("/get-by-nick")public String get…

数字保护的壁垒:探索 Web3 的网络安全

引言 随着数字化时代的到来&#xff0c;网络安全问题日益突出&#xff0c;而Web3作为新一代互联网的演进形态&#xff0c;其网络安全问题备受关注。本文将深入探讨Web3的网络安全特点、挑战以及应对策略&#xff0c;帮助读者更好地了解数字保护的壁垒与Web3的关系&#xff0c;…

ctfshow web入门 反序列化

254 分析代码&#xff1a; 如果用户名和密码参数都存在&#xff0c;脚本会创建一个 ctfShowUser 类的实例 $user。 接着&#xff0c;调用 $user->login($username, $password) 方法尝试登录。如果登录成功&#xff08;即用户名和密码与类中的默认值匹配&#xff09;&#…

vscode中导入#include “opencv2/opencv.hpp“

鼠标放到上面 点击快速修复 1.img.cpp // 图片的读取和显示 // 导入opencv头文件 #include "opencv2/opencv.hpp" #include <iostream>int main(int argc, char** argv) {// 读取图片&#xff0c;mat是matrix的缩写&#xff0c;是一个矩阵&#xff0c;类似与n…

睿眼(Realeye)视觉识别模型训练全流程心得分享

睿眼&#xff08;Realeye&#xff09;是一款集智能采集、识别、定位、抓取、视控全流程为一体的 AI 产品&#xff0c; 以其 AI 算法结合机械臂硬件实现对万事万物的定位抓取功能&#xff0c;能够实现对任意目标物从图 片采集、标注到模型训练和抓取。通过人性化的交互方式、易操…

自然语言处理: 第十九章LoRAQLoRA微调技巧

论文地址&#xff1a;使用低秩自适应 &#xff08;LoRA&#xff09; 进行参数高效LLM微调 - Lightning AI — Parameter-Efficient LLM Finetuning With Low-Rank Adaptation (LoRA) - Lightning AI 本篇文章是由位来自威斯康星大学麦迪逊分校的统计学助理教授Sebastian Raschk…

C++除了Qt还有什么GUI库?

C除了Qt还有什么GUI库&#xff1f; 先&#xff0c;不要折腾&#xff0c;不要想着用 C 来做 App 类的 GUI 开发。 所以你问用 c gui 库&#xff0c;本来确实有很多&#xff0c;但是经过几十年的沉淀&#xff0c;最后只留下一个 qt quick 和其他特殊需求的库&#xff08;包括 qt…

西圣、漫步者、万魔开放式耳机如何?甄选机型实测对比测评

无论是通勤、工作还是休闲时光&#xff0c;耳机总能为我们带来沉浸式的音乐体验。近年来&#xff0c;开放式耳机以其独特的优势逐渐受到市场的青睐&#xff0c;其中西圣、漫步者、万魔等品牌在市场上相当火热&#xff0c;那这三款开放式耳机的实际到底如何&#xff0c;还是有许…

nodeJs中实现连表查询

nodeJs中实现连表查询 router.post(/getOrder, async function(req, res, next) {let userId req.body.phone;let sql select * from orders where userId?;let orders await new Promise((resolve, reject) > {connection.query(sql, [userId], function(error, resul…

Python灰帽子网络安全实践

教程介绍 旨在降低网络防范黑客的入门门槛&#xff0c;适合所有中小企业和传统企业。罗列常见的攻击手段和防范方法&#xff0c;让网站管理人员都具备基本的保护能力。Python 编程的简单实现&#xff0c;让网络运维变得更简单。各种黑客工具的理论和原理解剖&#xff0c;让人知…

详解“外卡收单”系统(1)

近年来&#xff0c;随着跨境贸易和服务的不断发展&#xff0c;外卡收单行业展现出新的发展态势。随着越来越多外国人在中国消费&#xff0c;中国商家为满足海外消费者需求开始接受国际信用卡支付。根据官方数据显示&#xff0c;截至2023年11月&#xff0c;上海的外卡POS机已超过…

【C++】vector容器初步模拟

送给大家一句话&#xff1a; 努力一点&#xff0c;漂亮—点&#xff0c;阳光一点。早晚有一天&#xff0c;你会惊艳了时光&#xff0c;既无人能替&#xff0c;又光芒万丈。 vector容器初步模拟 1 认识vector开始了解底层实现 2 开始实现成员变量构造函数 析构函数尾插迭代器插入…

集成学习 | 集成学习思想:Boosting思想 | XGBoost算法、LightGBM算法

目录 一. XGBoost 算法1. XGBoost 算法流程2. XGBoost 算法评价 二. LightGBM 算法2. LightGBM 算法优势 上一篇文章中&#xff0c;我们了解了Boosting思想的两种算法&#xff1a;Adboost和GBDT&#xff1b;其中对于GBDT算法&#xff0c;存在两种改进&#xff0c;即&#xff1a…

外包干了20天,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;21年通过校招进入杭州某软件公司&#xff0c;干了接近2年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了2年的功能测试…

1分钟带你学会使用Python操作 xlsx 文件绘制面积图

​我们工作中经常要处理海量的数据&#xff0c;如果没有一个直观的可视化工具&#xff0c;怎么可能一眼就看出数据背后的故事呢&#xff1f;数据可视化显得越来越重要&#xff0c;数据分析已经成了现代人必备的技能。 今天来和大家分享一个超有趣的数据可视化方法——绘制面积…

Redis中文乱码问题

最近排查问题&#xff0c;发现之前的开发将日志写在redis缓存中&#xff08;不建议这样做&#xff09;&#xff0c;我在查看日志的时候发现没办法阅读&#xff0c;详细是这样的&#xff1a; 查阅资料后发现是进制问题&#xff0c;解决方法是启动客户端的时候将redis-cli改为red…

流畅的 Python 第二版(GPT 重译)(四)

第二部分&#xff1a;函数作为对象 第七章&#xff1a;函数作为一等对象 我从未认为 Python 受到函数式语言的重大影响&#xff0c;无论人们说什么或想什么。我更熟悉命令式语言&#xff0c;如 C 和 Algol 68&#xff0c;尽管我将函数作为一等对象&#xff0c;但我并不认为 Py…

【机器学习】机器学习是什么?

文章目录 前言 机器学习 序列学习和对抗学习有什么不同 总结 前言 在当今快速发展的科技时代&#xff0c;人工智能已经成为推动社会进步的重要力量。机器学习&#xff0c;作为人工智能领域的一个重要分支&#xff0c;它的核心能力在于使计算机系统能够从数据中学习规律&…

Python RPA简单开发实践(selenium登陆浏览器自动输入密码登陆)

打开csdn博客&#xff0c;简单版 class BS:def __init__(self, url):self.url url# self.password password# self.username usernamedef login_url(self):from selenium import webdriver# 不自动关闭浏览器option webdriver.ChromeOptions()option.add_experimental_opt…

Vue 若依框架 form-generator添加表格组件和动态表单组件

效果图&#xff1a; 在若依框架自带的流程表单配置基础上添加这两个组件 config.js // 表单属性【右面板】 export const formConf {formRef: elForm,formModel: formData,other: other,size: medium,labelPosition: right,labelWidth: 100,formRules: rules,gutter: 15,dis…