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

 什么是进程?


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

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

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


在操作系统中,我们常常使用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.mzph.cn/news/767721.shtml

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

相关文章

3.24 day3 QT

使用手动连接&#xff0c;将登录框中的取消按钮使用ot4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断u界面上输入的账号是否为"admin"&#xff0c;密码是否为&…

03-SparkSQL入门

0 Shark Spark 的一个组件&#xff0c;用于大规模数据分析的 SQL 查询引擎。Shark 提供了一种基于 SQL 的交互式查询方式&#xff0c;可以让用户轻松地对大规模数据集进行查询和分析。Shark 基于 Hive 项目&#xff0c;使用 Hive 的元数据存储和查询语法&#xff0c;并基于Hiv…

状态机高阶讲解-10

1896 01:19:16,700 --> 01:19:19,550 那接下来我们就开始来建模了 1897 01:19:20,690 --> 01:19:22,163 那建模的开始呢 1898 01:19:22,163 --> 01:19:24,900 我们就首先要添加一个类了 1899 01:19:26,330 --> 01:19:27,868 那我们这个很简单 1900 01:19:27,86…

力扣100热题[哈希]:最长连续序列

原题&#xff1a;128. 最长连续序列 题解&#xff1a; 官方题解&#xff1a;. - 力扣&#xff08;LeetCode&#xff09;题解&#xff0c;最长连续序列 &#xff1a;哈希表 官方解题思路是先去重&#xff0c;然后判断模板长度的数值是否存在&#xff0c;存在就刷新&#xff0c…

js教程(8)

一、事件流 1.概述 在JavaScript中&#xff0c;事件流描述的是事件在DOM结构中传播和被处理的顺序。事件流分为冒泡阶段和捕获阶段。 冒泡阶段&#xff08;Bubbling Phase&#xff09;&#xff1a;事件首先从最内层的元素开始向父级元素传播&#xff0c;一直传播到最外层的元素…

论文:Scalable Zero-shot Entity Linking with Dense Entity Retrieval翻译笔记(实体链接)

文章目录 论文标题&#xff1a;通过密集实体检索实现可扩展的零镜头实体链接摘要1 引言2 相关工作3 定义和任务制定4 方法4.1 双编码器4.2 交叉编码器4.3 知识蒸馏 5 实验5.1 数据集5.2 评估设置和结果5.2.1 零点实体链接5.2.2 tackbp-20105.2.3 WikilinksNED Unseen-Mentions …

c++常考基础知识(2)

二.c关键字 关键字汇总 c中共有63个关键字&#xff0c;其中包括int&#xff0c;char&#xff0c;double等类型关键字&#xff0c;if&#xff0c;else&#xff0c;while&#xff0c;do&#xff0c;等语法关键字&#xff0c;还有sizeof等函数关键字。 三.数据结构 1.数组&#x…

阿里云-零基础入门NLP【基于深度学习的文本分类3-BERT】

文章目录 学习过程赛题理解学习目标赛题数据数据标签评测指标解题思路BERT代码 学习过程 20年当时自身功底是比较零基础(会写些基础的Python[三个科学计算包]数据分析)&#xff0c;一开始看这块其实挺懵的&#xff0c;不会就去问百度或其他人&#xff0c;当时遇见困难挺害怕的…

一键入门Ubuntu22!

目录 一、安装 二、常用目录 三、常用指令 四、用户指令 五、ssh与scp 六、服务相关 七、Python与Pycharm 八、Vim编辑器 九、Ubuntu22下使用Mysql 十、Ubuntu22下使用mongodb 十一、Ubuntu22下使用redis Ubuntu是一个基于Debian的开源操作系统&#xff0c;由Canoni…

Java 自定义线程池实现

自定义线程池 简介任务图示阻塞队列 BlockingQueue<T>ReentrantLock代码 线程池 ThreadPool工作线程类 Worker 拒绝策略接口代码测试类 TestThreadPool为什么需要j i&#xff1f;&#xff08;lambad表达式相关&#xff09; 测试结果拒绝策略&#xff1a;让调用者自己执行…

求解线性方程组

如图题意看出x1有且仅有两种可能&#xff0c;1或者0&#xff0c;且知道了所有a的值&#xff0c;且因为要求所得答案字典序最小&#xff0c;所以先假设x10。 又因a2x1x2所以可以求出x2的值&#xff0c;又如a2x1x2x3,所以可以求出x3的值依次求出所有x的值&#xff0c;但每求出一…

SpringCloud-记

目录 什么是SpringCloud 什么是微服务 SpringCloud的优缺点 SpringBoot和SpringCloud的区别 RPC 的实现原理 RPC是什么 eureka的自我保护机制 Ribbon feigin优点 Ribbon和Feign的区别 什么是SpringCloud Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发…

2024/3/24周报

文章目录 摘要Abstract文献阅读题目引言创新点数据处理研究区域和数据缺失值处理水质相关分析 方法和模型LSTMAttention机制AT-LSTM模型 实验结果 深度学习transformer代码实现1 模型输入1.1 Embedding层1.2 位置编码 2 Encoder2.1 编码器2.2 编码器层2.3注意力机制2.4多头注意…

第五讲 哈希表

我们在前面讲了存储层&#xff0c;以及从次磁盘中将页面加载到缓冲池【Buffer Pool】中&#xff0c;现在我们继续往上&#xff0c;来讨论如何支持 DBMS 的执行引擎从页面中读取/写入数据。这部分是访问方法层的功能&#xff0c;它负责通过索引或者表本身&#xff0c;设置是其他…

生物信息学文章中常见的图应该怎么看?

目录 火山图 热图 箱线图 森林图 LASSO回归可视化图&#xff08;套索图&#xff09; 交叉验证图 PCA图 ROC曲线图 这篇文章只介绍这些图应该怎么解读&#xff0c;具体怎么绘制&#xff0c;需要什么参数&#xff0c;怎么处理数据&#xff0c;会在下一篇文章里面给出 火山…

python之jsonpath的使用

文章目录 介绍安装语法语法规则举例说明 在 python 中使用获取所有结构所有子节点的作者获取所有子孙节点获取所有价格取出第三本书的所有信息取出价格大于70块的所有书本从mongodb 中取数据的示例 介绍 JSONPath能在复杂的JSON数据中 查找和提取所需的信息&#xff0c;它是一…

Java设计模式之单例模式(多种实现方式)

虽然写了很多年代码&#xff0c;但是说真的对设计模式不是很熟练&#xff0c;虽然平时也会用到一些&#xff0c;但是都没有深入研究过&#xff0c;所以趁现在有空练下手 这章主要讲单例模式&#xff0c;也是最简单的一种模式&#xff0c;但是因为spring中bean的广泛应用&#…

YoloV8改进策略:BackBone改进|PKINet

摘要 PKINet是面向遥感旋转框的主干,网络包含了CAA、PKI等模块,给我们改进卷积结构的模型带来了很多启发。本文,使用PKINet替代YoloV8的主干网络,实现涨点。PKINet是我在作者的模型基础上,重新修改了底层的模块,方便大家轻松移植到YoloV8上。 论文:《Poly Kernel Ince…

计算机三级网络技术 选择+大题234笔记

上周停去准备计算机三级的考试啦&#xff0c;在考场上看到题目就知道这次稳了&#xff01;只有一周的时间&#xff0c;背熟笔记&#xff0c;也能稳稳考过计算机三级网络技术&#xff01;

鸿蒙开发学习:【华为支付服务客户端案例】

简介 华为应用内支付服务&#xff08;HUAWEI In-App Purchases&#xff09;支持3种商品&#xff0c;包括消耗型商品、非消耗型商品和订阅型商品。 消耗商品&#xff1a;仅能使用一次&#xff0c;消耗使用后即刻失效&#xff0c;需再次购买。非消耗商品&#xff1a;一次性购买…