【javaEE-有关CPU进程和线程实现的并发编程及二者的区别】

🔥🔥🔥有关进程并发编程开发的成本问题

这次之前其实我们所有的写的程序都是使用单核心来运行的,但是一般我们的计算机都有很多核心,如果我们编程的时候,只使用一个核心的话,其实这是一个非常大的浪费,所以我们引进了多进程这种并发编程来充分利用计算机的多核心。但是随着我们的需求越来越大,进程的一些缺点就显现出来了。

  • 创建和销毁进程的成本很大
  • 越来越多的需求场景需要一种更方便的并发编程形式
  • 线程的出现

由此我们发明了一个新的并发编程的形式,线程(Thread),对比进程,它的创建和销毁成本更小,更轻量。因此现在的主流并发编程的形式就是多线程编程。

在这里插入图片描述

🔥🔥🔥多线程编程

对于进程来说,一个进程是由一组PCB类似于结构体的形式对数据进行描述,进一步的通过链表的形式将数据组织起来。对于线程来说,一个线程是只有有一个PCB结构的形式,所以这里就有一个包含关系:一个进程中可以包含多个线程,此时每一个线程都可以独立的在CPU上调度执行,这里我们对进程和线程做一个总结:

  • 进程是系统资源分配的基本单位
  • 线程是cpu调度执行的基本单位

一个可执行的程序,双击exe文件,系统就会创建一个进程,给这个进程中分配一些系统资源(硬盘,cpu,内存,网络带宽等)。在这个进程中会创建一个或多个线程。这些线程才在cpu中调度执行。同一个进程中的多个线程其实是共用同一份系统资源的。

对比进程,线程是更轻量的,主要是在我们创建一个进程的时候,就已经创建了一个线程了,同时就会分配系统资源,后序我们在创建第二个第三个线程的时候,就不用再分配资源了~,因此他就省去了分配资源的过程。也省去了释放资源的过程。在这里插入图片描述

🔥🔥🔥系统分析多线程调度执行过程

比如说现在有请我们最可爱的joey老铁上场,此时在一个房间里他要一个人吃完100只鸡。
在这里插入图片描述
为了提高老铁的吃鸡效率,我们可以引用多进程的概念,在创建一个房间,还是一个joey老铁,只需要吃50只鸡。
在这里插入图片描述
这样确实提高了joey吃鸡的效率,但是我们其实不难发现这种效率是非常低的,我们显然可以用一个更简单的方式提高吃鸡的效率,我们可以在一个房间里引进多个joey老铁,这样的方式不仅大大提高了吃鸡的效率,而且大大缩减了成本的损耗。这其实就是多线程的概念。相比于多进程,这种形式效率是极高的。
在这里插入图片描述

那我们就自然的想到,在引进一些线程,会不会进一步提高效率呢?当然会!!!
在这里插入图片描述
但是当我们将线程增加带一些程度的时候,就会出现问题了~
在这里插入图片描述
此时就再也无法通过增加线程的方式,提高程序执行的效率了,因为桌子的空间是有限的,我们增加多个joey后,势必会有一些joey老铁是吃不到桌子上的鸡的,即线程多了,cpu的资源是有限的,这样就无法提高效率了。

有时甚至可能会由于线程的增多,导致线程可能会争夺系统资源,最后导致系统崩溃!!!

🔥🔥🔥线程和进程的概念即区别

1. 进程包含线程: 即一个进程中可以包含一个或者多个线程,但是不能没有线程,当我们创建一个main函数时就是一个主线程。
2. 进程是系统资源分配的基本单位,线程是系统调度执行的基本单位。
3. 同一个进程中的所有线程其实是共用同一份系统资源的(硬盘,内存,网络带宽等)
4. 线程是当下实现并发编程的主流方式,通过多线程可以很好的利用cpu的多核心特性~但是并不是线程越多越好的,随着线程的增多(当然创建线程也会有一定的开销),可能会导致多个线程之间争夺系统资源,甚至导致系统的崩溃
5. 多个线程之间,其实也存在一定的安全问题,当一个线程产生异常时,可能也会影响其他线程的正常执行~
6. 多个进程之间一般是不会相互影响的,、一个进程崩溃,并不会影响其他进程的运行(这也称为“进程的隔离性”)。在这里插入图片描述

这个问题非常重要,是面试的高频问题,一定要牢记于心啊!!!

🔥🔥🔥如何在java中创建线程

线程其实是属于操作系统中的概念,操作系统会提供api,供程序员调用,但是不同的操作系统其实对应的api是不同的,java中jvm已经替我们将这些api封装好了,我们只需要关注jvm中的这一套api就好了。
一般我们通过使用Thread这个类来完成多线程的开发。

🗼🗼🗼继承Thread重写Run方法创建线程

class MyThread extends Thread{
    @Override
    public void run() {
        System.out.println("Thread hello");
    }
}
public class Demo2 {
    public static void main(String[] args) {
        MyThread t=new MyThread();
        t.start();
        System.out.println("main hello");
    }
}

这里的run函数的主体其实就是我们完成线程主体任务的地方,在这里实现代码的主体部分,然后通过start方法,真正在内存中创建一个线程,通过回调函数run执行相关操作。回调函数就是用户手动定义了,但是没有手动调用,但是最后被系统调用的函数。

🗼🗼🗼实现Runnable创建线程

class MyRunnable implements Runnable{
    @Override
    public void run() {
        while(true){
            System.out.println("hello thread");
            try{
                Thread.sleep(1000);
            }catch (InterruptedException e){
                throw new RuntimeException(e);
            }
        }
    }
}
public class Demo3 {
    public static void main(String[] args) throws InterruptedException {
        MyRunnable runnable=new MyRunnable();
        Thread t=new Thread(runnable);
        t.start();
        while(true){
            System.out.println("hello main");
            Thread.sleep(1000);
        }
    }
}

这里的sleep是Thread中的库函数,可以不导入包直接调用,但是这里存在一个受查异常,所以要进行异常捕捉。由于父类中的run方法并没有这个异常所以我们只能利用try-catch,而不能把异常向上抛出。

🗼🗼🗼继承Thread利用匿名内部类实现一个线程

public static void main(String[] args) throws InterruptedException{
        Thread t=new Thread(){
            @Override
            public void run() {
                while(true){
                    System.out.println("hello thread");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        };
        t.start();
        while(true){
            System.out.println("hello main");
            Thread.sleep(1000);
        }
    }

匿名内部类定义在一个类的内部,只能使用一次。

🗼🗼🗼实现Runnable利用匿名内部类创建线程

public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    System.out.println("hello thread");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        });
        while (true) {
            System.out.println("hello main");
            Thread.sleep(1000);
        }
    }

🗼🗼🗼利用lamda表达式创建一个线程

    public static void main(String[] args) throws InterruptedException{
        Thread t=new Thread(()->{
             while(true){
                 System.out.println("thread hello");
                 try{
                     Thread.sleep(1000);
                 }catch (InterruptedException e){
                     throw new RuntimeException(e);
                 }
             }
        },"自定义线程");
        t.start();
        while(true){
            System.out.println("hello main");
            Thread.sleep(1000);
        }
    }

好了,今天就分享这么多了,感兴趣的话关注不迷路哦

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通俗范畴论2 有向图与准范畴

退一步海阔天空,在正式进入范畴论之前,我们可以重新审视一下我们是如何认识世界的,有了这个对人类认识世界过程的底层理解,可以帮助我们更好地理解范畴论。 对于人类认识世界,最神奇的一点就是这个世界居然是可以认识…

【C语言】解决C语言报错:Race Condition

文章目录 简介什么是Race ConditionRace Condition的常见原因如何检测和调试Race Condition解决Race Condition的最佳实践详细实例解析示例1:缺乏适当的同步机制示例2:错误使用条件变量 进一步阅读和参考资料总结 简介 Race Condition(竞争条…

element-ui input输入框和多行文字输入框字体不一样

页面中未作样式修改,但是在项目中使用element-ui input输入框和多行文字输入框字体不一样,如下图所示: 这是因为字体不一致引起的,如果想要为Element UI的输入框设置特定的字体,你可以在你的样式表中添加以下CSS代码…

尚品汇-(二)

本地域名解析器:当我们在浏览器输入域名的时候,它首先找的不是远程的DNS,而是去本地的host中去找这个域名有没有对应的,如果有对应的,那么就根据对应的ip进行访问 一:环境安装 1.安装JAVA 运行环境 第一…

MySQL之优化服务器设置(四)

优化服务器设置 InnoDB的IO配置 双写缓冲(Doublewrite Buffer) InnoDB用双写缓冲来避免页没写完整所导致的数据损坏。当一个磁盘写操作不能完整地完成时,不完整的页写入就可能发生,16KB的页可能只有一部分被写到磁盘上。有多种多样的原因(崩溃、Bug&am…

Obsidian 工作区Workspace:实现切换和管理工作区的多任务处理插件

工作区 工作区是Obsidian 的核心插件之一,旨在帮助用户更好地管理和组织他们的工作环境。 功能简介 工作区保存和切换:Workspace 插件允许用户保存当前的窗口布局和打开的笔记状态,用户可以随时切换到不同的工作区,这样可以根据…

Matlab|基于手肘法的kmeans聚类数的精确识别【K-means聚类】

主要内容 在电力系统调度研究过程中,由于全年涉及的风、光和负荷曲线较多,为了分析出典型场景,很多时候就用到聚类算法,而K-means聚类就是常用到聚类算法,但是对于K-means聚类算法,需要自行指定分类数&…

Google Earth Engine(GEE)——计算闪闪红星的ndvi的值和折线图(时序分析)

函数: ui.Chart.image.doySeries(imageCollection, region, regionReducer, scale, yearReducer, startDay, endDay)

中小学电子教材下载办法(202406最简单的)

官方版本 现在能阅读电子教材的官方网站挺多的,例如 人民教育出版社-电子教材,还有 国家中小学智慧教育平台 ,其他还有很多可在阅读的网站。由于平台的原因不能直接贴链接,大家可以通过搜索关键词找到网站。 如何下载 据我所知…

idea搜索只显示100条、如何修改idea搜索的条数

文章目录 一、老版本的IDEA(2021年之前的版本)二、新版本的IDEA(2021年及之后的版本)2.1、方式一2.2、方式二 如下图:idea搜索的时候默认只显示100条 要解决IDEA搜索只显示100条的问题,可以通过修改搜索结…

【推荐】Perl入门教程特点功能文本处理读取文件替换文本写入文件分割字符数据库处理环境准备安装(包含示咧)

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

HashMap详解(含动画演示)

目录 HashMap1、HashMap的继承体系2、HashMap底层数据结构3、HashMap的构造函数①、无参构造②、有参构造1 和 有参构造2 (可以自定义初始容量和负载因子)③、有参构造3(接受一个Map参数)JDK 8之前版本的哈希方法:JDK 8版本的哈希方法 4、拉链法解决哈希冲突什么是拉…

监控室,屏幕显示不支持码流

1号屏,出现不支持码流 如下原因 老是录像机 无法关闭自动添加摄像头功能, 其他杂牌摄像头 会自动还ip 最终导致 ip冲突 更换ip 可以解决

Arnoldi Iteration 思考

文章目录 1. 投影平面2. Arnoldi Iteration3. python 代码 1. 投影平面 假设我们有一个向量q,我们需要关于向量q,构建一个投影平面P,使得给定任何向量v,可以通过公式 p P v pPv pPv,快速得到向量v在投影平面P上的投影向量p. 计算向量内积,…

部署LVS-DR群集...

目录 最后一台主机(第四台) 本地yum源安装httpd(非必做) 继续开始从最后一台主机开始(第四台) 转第二台主机 转第三台主机 回第二台 上传 转第三台主机 上传 回第二台 转第三台 转第一台主机…

Parallelize your massive SHAP computations with MLlib and PySpark

https://medium.com/towards-data-science/parallelize-your-massive-shap-computations-with-mllib-and-pyspark-b00accc8667c (能翻墙直接看原文) A stepwise guide for efficiently explaining your models using SHAP. Photo by Pietro Jeng on Unsplash Int…

前端:鼠标点击实现高亮特效

一、实现思路 获取鼠标点击位置 通过鼠标点击位置设置高亮裁剪动画 二、效果展示 三、按钮组件代码 <template><buttonclass"blueBut"click"clickHandler":style"{backgroundColor: clickBut ? rgb(31, 67, 117) : rgb(128, 128, 128),…

docker login 报错: http: server gave HTTP response to HTTPS client

环境&#xff1a; 自建 Harbor、Docker 1. 问题分析 # 命令&#xff0c;这里用的是 IP&#xff0c;可以为域名 docker login -u test 172.16.51.182:31120 # 输入密码 Password:# 报错如下&#xff1a; Error response from daemon: Get "https://172.16.51.182:31120/…

[DDR4] DDR 简史

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解DDR4》 存和硬盘&#xff0c;这对电脑的左膀右臂&#xff0c;共同扛起了存储的重任。内存以其超凡的存取速度闻名&#xff0c;但一旦断电&#xff0c;内存中的数据也会消失。它就像我们的工作桌面&…