进程与线程+多线程优势

区别:

1、进程中包含线程,每一个进程都至少一个线程(主线程)

2、进程是申请系统资源的最小单位

3、进程是CPU调度的最小单位

4、线程之间共享进程申请的系统资源

5、一个线程崩溃了会影响整个进程

进程的组织方式:

通过一个双向链表组织PCB:

创建一个进程就是把PCB加入到链表中;

销毁一个进程就是把PCB从链表中删除;

查看所有的进程就是遍历双向链表。

线程概念及优势:

多进程能充分利用CPU资源去处理复杂业务,从而提高效率。

但是进程申请资源对系统的性能影响较大,涉及内存和文件资源,处理一个事情有一份资源就够了。

线程用的就是进程启动时从操作系统中分配的资源,(线程也可以叫轻量级的进程),当创建一个进程时,进程中就会包含一个线程,叫主线程。

我们可以理解为进程就是一个公司,线程就是员工,一个公司可以有多个员工,一个进程可以创建多个线程。

优势:

创建速度比进程快;

销毁速度比进程快;

线程的CPU调度速度比进程快。

线程的创建:

创建线程的个数,根据CPU逻辑处理器数量来作为参考

通过多线程的方式可以提高效率,但当线程数量大于逻辑处理器数时,由于过多线程处于阻塞等待状态,不能真正发挥作用,反而因创建线程消耗系统资源。

当某一个线程出现问题,会影响其他线程,进而影响整个进程。

一个线程崩溃会导致整个进程崩溃。

线程的创建方式:

在JAVA中Thread类用来描述一个线程,创建的每个线程都是Thread类的对象

1、继承Thread类(线程对象),重写run()方法(线程要执行的具体任务)

public class Demo {
    public static void main(String[] args) {
        //线程的多种创建方式

        //通过继承Thread类并重写run方法
        MyThread t1 = new MyThread();
    }
}

class MyThread extends Thread{
    @Override
    public void run(){
        System.out.println("hello my Thread");
    }
}

2、实现Runnable接口,重写run()方法

public class Demo_206 {
    public static void main(String[] args) {
        //线程的多种创建方式

          //通过Runnable示例来单独定义线程的任务对象
        MyRunnable r1 = new MyRunnable();
        Thread thread = new Thread(r1);
    }
}
class MyRunnable implements Runnable{
    @Override
    public void run(){
        System.out.println("hello my Runnable");
    }
}

更推荐第二种

简化的方式:

通过匿名内部类的方式,创建Thread的子类,Runnable的子类

public class Demo_206 {
    public static void main(String[] args) {
        //线程的多种创建方式

        //通过创建Thread匿名内部类的方式创建线程
        Thread thread1 = new Thread(){
            @Override
            public void run(){
                System.out.println("通过Thread匿名内部类的方式创建线程");
            }
        };

        //匿名内部类,Runnable
        Thread thread2 = new Thread(new Runnable(){
            @Override
            public void run(){
                System.out.println("匿名内部类,Runnable……");
            }
        });

    }
}

通过Lambda表达式的方式,简洁方便

public class Demo_206 {
    public static void main(String[] args) {
        //线程的多种创建方式

        //通过Lambda表达式创建一个线程
        Thread thread3 = new Thread(()->{
            System.out.println("通过Lambda表达式创建线程……");
        });
    }
}

多线程的优势:

能够增加运行速度。

通俗讲,

一个大的任务来分配给多个执行者来一起执行就会更快完成任务,进而提高效率;


设置一个场景,执行两次自增到10亿的操作,

单线程,串行执行任务;

多线程,这里设置两个线程,两个线程分别执行;

public class Demo {
    //大数可以使用分隔符_
    private static long count = 10_0000_0000l;
    public static void main(String[] args) {
        //串行
        serial();
        //并行
        concurrency();
    }
    private static void concurrency(){
        //记录开始时间
        long begin = System.currentTimeMillis();
        //创建两个线程,各自累加
        Thread t1 = new Thread(()->{
                long a = 0l;
                for(int i = 0; i < count; i++){
                    a++;
                }
        });
        t1.start();//启动线程
        Thread t2 = new Thread(()->{
            long b = 0l;
            for(int i = 0; i < count; i++){
                b++;
            }
        });
        t2.start();//启动线程
        long end = System.currentTimeMillis();

        System.out.println("并行执行时间:"+ (end - begin));
        
    }
    private static void serial(){
        //记录开始时间
        long begin = System.currentTimeMillis();
        long a = 0l;
        for(int i = 0; i < count; i++){
            a++;
        }
        long b = 0l;
        for(int i = 0; i < count; i++){
            b++;
        }
        //记录结束时间
        long end = System.currentTimeMillis();
        System.out.println("串行执行时间:" + (end - begin));
    }
}

结果:

我们可以看到并行执行时间快很多,但是这并不是真的并行执行时间,

开始记录时间后创建了线程t1,然后开启t1,接着创建线程t2并开启该线程,然后就打印了执行时间,但此时两个线程还在执行任务,没有结束。

要想打印出真正的并行执行时间,可以让线程调用join()方法,哪个线程调用join方法,主线程就要等待该线程执行完它的任务

所以我们能够看出通过多线程的方式能够提高效率,并行的执行时间是串行的一半多一点,之所以多一点是由于创建线程还会耗时。

但并不是多线程的效率都比单线程高,当任务量很少时,由于多线程创建会耗时,单线程效率可能更高。

当把10亿换成5万后可以看到串行执行时间更短,效率更高

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

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

相关文章

期权懂|期权策略中两边开卖方实值对冲会有盈利区间吗?

期权小懂每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 期权策略中两边开卖方实值对冲会有盈利区间吗&#xff1f; 一、期权策略中两边开卖方实值对冲的盈利区间可以‌核心策略‌分析‌&#xff1a; 期权对冲策略的核心是利用期权的特…

Follow软件的使用入门教程

开篇 看到很多兄弟还不知道怎么用这个当下爆火的浏览器&#xff01;在这里简单给需要入门的小伙伴一些建议&#xff1a; 介绍 简单解释一下&#xff0c;RSS 意思是简易信息聚合&#xff0c;用户可以通过 RSS 阅读器或聚合工具自主订阅并浏览各个平台的内容源&#xff0c;不用…

数字孪生的建构之路:从数据到智能

数字孪生是一种将物理实体系统或产品的数字化表示与其实体对应物相结合的概念&#xff0c;通过这种数字化技术&#xff0c;可以实时监测、预测和优化管理实体系统。实现数字孪生需要经历从数据采集、处理到智能化决策等多个步骤。以下是关于如何实现数字孪生的详细介绍。 1. 数…

【C#】创建一个主菜单和弹出菜单系统

文章目录 1. 创建WinForms项目2. 设计窗体3. 添加MenuStrip4. 配置菜单项5. 添加TextBox6. 编写事件处理代码7. 运行和测试 根据您提供的文件内容&#xff0c;看起来您需要在C# WinForms应用程序中设置一个窗体&#xff0c;其中包含一个文本框和几个菜单项&#xff0c;用于改变…

运维告警策略优化与实践

在运维行业中&#xff0c;告警策略的制定与执行是确保系统稳定性和业务连续性的关键环节。面对日益复杂的IT环境和不断变化的运维需求&#xff0c;如何合理制定并优化告警策略&#xff0c;成为运维团队必须面对的重要课题。本文将结合运维行业的现状、挑战及需求&#xff0c;深…

算法通关(3) -- kmp算法

KMP算法的原理 从题目引出 有两个字符串s1和s2,判断s1字符串是否包含s2字符串&#xff0c;如果包含返回s1包含s2的最左开头位置&#xff0c;不包含返回-1&#xff0c;如果是按照暴力的方法去匹配&#xff0c;以s1的每个字符作为开头&#xff0c;用s2的整体去匹配&#xff0c;…

vue3+vite搭建脚手架项目使用eletron打包成桌面应用+可以热更新

当前Node版本&#xff1a;18.12.0&#xff0c;npm版本&#xff1a;8.19.2 1.搭建脚手架项目 搭建Vue3ViteTs脚手架-CSDN博客 可删掉index.html文件的title标签 2.配置package.json {"name": "my-vite-project","private": true,"versi…

Java学习者的福音:SpringBoot教学辅助平台

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理教学辅助平台的相关信息成为必然。开发合适…

JAVA基础:数组 (习题笔记)

一&#xff0c;编码题 1&#xff0c;数组查找操作&#xff1a;定义一个长度为10 的一维字符串数组&#xff0c;在每一个元素存放一个单词&#xff1b;然后运行时从命令行输入一个单词&#xff0c;程序判断数组是否包含有这个单词&#xff0c;包含这个单词就打印出“Yes”&…

网络层5——IPV6

目录 一、IPv6 vs IPv4 1、对IPv6主要变化 2、IPv4 vs IPv6 二、IPv6基本首部 1、版本——4位 2、通信量类——8位 3、流标号——20位 4、有效载荷长度——16位 5、下一个首部——8位 6、跳数限制——8位 7、源 、 目的地址——128位 8、扩展首部 三、IPv6地址 1…

AIRIS 是一种学习型人工智能,它正在自学如何玩 Minecraft

AI开发公司SingularityNET和人工超级智能联盟&#xff08;ASI Alliance&#xff09;表示,随着人工智能学习如何通过操作玩游戏,一种新的学习型AI已被留在Minecraft的实例中。名为AIRIS&#xff08;自主智能增强推断象征主义&#xff09;的AI基本上是从Minecraft内部开始学习如何…

嵌入式学习-网络高级-Day01

嵌入式学习-网络高级-Day01 【1】Modbus协议 起源 分类 优势 应用场景 【2】Modbus TCP 特点 组成 报文头&#xff1a;7个字节 寄存器&#xff08;存储数据&#xff09; 功能码 总结 练习 【3】工具安装 Modbus Slave、Poll安装 网络调试助手 wireshark 练习 【1】Modbus协议 起…

Java项目实战II基于Spring Boot的问卷调查系统的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导 一、前言 在当今信息爆炸的时代&#xff0c;问卷调查…

【c++语言程序设计】数组(对象数组)

数组是一种按照特定顺序排列的对象集合体&#xff0c;数组中的每个对象称为“元素”。数组的每个元素都用“数组名下标”的形式来表示&#xff0c;并且同一数组内的所有元素类型相同。数组可以由任何类型的数据构成&#xff08;除 void 外&#xff09;&#xff0c;且数组的概念…

5分钟跑起来:Java构建的AI人工智能智能问答系统_springboot_spring ai_LLM_人工智能_开源免费使用

Agenda&#xff1a; 1&#xff09;介绍一下AI支持下的智能问答系统有哪些主要模块 2&#xff09;一个可以跑起来的代码样例&#xff0c;说明怎么用Java构建这个AI智能问答系统 AI人工智能智能问答系统简介 智能问答系统是一种利用人工智能技术理解并回答用户提问的应用。该系…

如何基于pdf2image实现pdf批量转换为图片

最近为了将pdf报告解析成为文本和图片&#xff0c;需要将大量多页的pdf文件拆分下单独的一页一页的图像&#xff0c;以便后续进行OCR和图像处理&#xff0c;因此就需要实现将pdf2image&#xff0c;本文主要结合开源的pdf2image和poppler&#xff0c;实现了pdf转换为png格式图片…

Pytorch用BERT对CoLA、新闻组文本数据集自然语言处理NLP:主题分类建模微调可视化分析

原文链接&#xff1a;https://tecdat.cn/?p38181 原文出处&#xff1a;拓端数据部落公众号 自然语言处理&#xff08;NLP&#xff09;领域在近年来发展迅猛&#xff0c;尤其是预训练模型的出现带来了重大变革。其中&#xff0c;BERT 模型凭借其卓越性能备受瞩目。然而&#…

Kaggle:免费 GPU 使用指南,Colab 的理想替代方案

如果电脑显卡性能不足&#xff0c;又无法访问 Colab 的免费 GPU&#xff0c;那该怎么开始之后的学习呢&#xff1f; 答案是 Kaggle。 Kaggle 不仅提供免费的 GPU 计算资源&#xff0c;还可以直连而无需翻墙&#xff0c;同时不需要海外手机号验证。接下来&#xff0c;文章将详细…

Zookeeper 简介 | 特点 | 数据存储

1、简介 zk就是一个分布式文件系统&#xff0c;不过存储数据的量极小。 1. zookeeper是一个为分布式应用程序提供的一个分布式开源协调服务框架。是Google的Chubby的一个开源实现&#xff0c;是Hadoop和Hbase的重要组件。主要用于解决分布式集群中应用系统的一致性问题。 2. 提…

神经网络基础--什么是神经网络?? 常用激活函数是什么???

前言 本专栏更新神经网络的一些基础知识&#xff1b;案例代码基于pytorch&#xff1b;欢迎收藏 关注&#xff0c; 本人将会持续更新。 神经网络 1、什么是神经网络 人工神经网络&#xff08; Artificial Neural Network&#xff0c; 简写为ANN&#xff09;也简称为神经网络…