【Java|多线程与高并发】进程与线程的区别与联系

news2024/11/24 22:31:27

文章目录

  • 什么是进程
  • 什么是线程
  • 上下文切换
  • 多线程一定比串行执行快吗
  • 进程与线程的区别与联系

什么是进程

进程的定义:进程是正在运行的程序实体,并且包括这个运行的程序中占据的所有系统资源,比如说CPU(寄存器),IO,内存,网络资源等。

但这些定义十分抽象,可以打开任务管理器来查看进程
在这里插入图片描述
操作系统中的一个exe程序就可以认为是进程

什么是线程

线程的定义:线程是指进程中的一个执行流程,一个进程中可以运行多个线程。

线程可以理解为进程执行中的一些子任务,这些线程各自执行一些任务,才构成了一个完整的exe程序(进程).
因此 先有进程,后有线程,进程中可以创建多个线程,至少有一个线程,但不能没有线程
进程负责向操作系统申请资源,在一个进程中,多个线程共享相同的内存和文件资源.

上下文切换

即使是单核处理器也支持多线程执行代码,进行并发编程时,CPU会不断地切换线程执行.但是切换的时间很快,因此我们是感知不到线程是切换的
CPU通过时间分配算法来循环执行任务,当执行一段时间后切换到另一个任务.在切换之前,需要保存上一个任务执行的状态,以便下次切换回来的时候,再加载这个任务的状态,可以接着上次切换前的状态继续往下运行,任务从保存到再加载的过程就是一次上下文切换

减少上下文的方法有:无锁并发编程 CAS算法 使用最少线程和使用协程

多线程一定比串行执行快吗

通过以下简单的示例即可验证:

public class Example3 {

    private static final long count = 10000001;

    public static void main(String[] args) {
        concurrency();
        serial();
    }
    private static void concurrency(){
        long start = System.currentTimeMillis();// 记录程序开始运行的时间
        Thread thread = new Thread(()->{
            int a = 0;
            for (long i = 0; i < count; i++) {
                a++;
            }
        });
        thread.start();
        int b = 0;
        for (long i = 0; i < count; i++) {
            b++;
        }
        try {
            thread.join();// 等待线程结束
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        long end = System.currentTimeMillis();// 记录结束时间
        System.out.println(end-start);
    }
    private static void serial(){
        long start = System.currentTimeMillis();
        int a = 0;
        for (long i = 0; i < count; i++) {
            a++;
        }
        int  b = 0;
        for (long i = 0; i < count; i++) {
            b++;
        }
        long end = System.currentTimeMillis();
        System.out.println(end-start);
    }
}

通过改变count的值,来观察它们运行时间的差距即可
因此很容易得出结论: 多线程不一定比串行执行快 只有当数据量足够多时,多线程才比串行执行快
这是因为线程在创建以及进行上下文交换时有一定的开销.

进程与线程的区别与联系

  1. 在启动线程时,只有第一个线程的开销比较大,后面的开销就很小了
  2. 在不支持线程的操作系统中,进程既是资源分配的基本单位,也是调度的基本单位;在拥有线程的操作系统中,线程是调度的基本单位,而进程是资源分配的基本单位。
  3. 进程虽然是独立的,但它们之间可以相互通信
  4. 线程在进程中,属于子集关系
  5. 虽然线程很轻,但是线程之间的上下文切换时间成本很高

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

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

相关文章

自学前端最容易犯的10个的错误,入门学前端快来看看

在前端学习过程中&#xff0c;有很多常见的误区&#xff0c;包括过度关注框架和库、缺乏实践、忽视算法和数据结构、忽视浏览器兼容性、缺乏团队合作经验、忽视可访问性、重构次数过多、没有关注性能、缺乏设计知识以及没有持续学习等。要避免这些误区&#xff0c;应该注重基础…

Lambda表达式详细操作

一、基础语法 形态一&#xff1a;匿名内部类 Runnable runnable new Runnable() {Overridepublic void run() {System.out.println(Thread.currentThread().getName());} };runnable.run();形态二&#xff1a;完整的Lambda表达式 口诀&#xff1a;复制小括号&#xff0c;写…

消息中间件----内存数据库 Redis7(第1章 Redis 概述)

第1章 Redis 概述1.1 Redis 简介Redis&#xff0c;Remote Dictionary Server&#xff0c;远程字典服务&#xff0c;由意大利人 Salvatore Sanfilippo&#xff08;又名Antirez&#xff09;开发&#xff0c;是一个使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、…

【路径规划】基于Dijkstra算法及Floyd算法的通信与网络路径规划(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Dubbo相关问题合集

Dubbo相关问题合集 java.io.StreamCorruptedException: invalid stream header: 77D30000 ; Decode rpc invocation failed 现象 2023-02-14 09:49:32.251 [NettyServerWorker-4-2] [] [WARN] o.a.d.r.exchange.codec.ExchangeCodec-130 [DUBBO] Skip input stream 634, du…

go gin学习记录2

环境 环境&#xff1a;mac m1&#xff0c;go version 1.17.2&#xff0c; goland&#xff0c; mysql 昨天学习了安装和基本的参数&#xff0c;路由使用&#xff0c;今天接着学习一下数据库的操作。 建立数据库 测试数据库操作&#xff0c;需要先准备一个测试用的数据库&…

【自适应软件开发过程思想】自适应软件开发 - 简介 Adaptive Software Development Introduction(中英文)

目录 ASWD 核心思想 什么是敏捷(Agile)? 敏捷宣言(Agile Manifesto) 敏捷的特征

微前端指北

微前端概述 Techniques, strategies and recipes for building a modern web app with multiple teams that can ship features independently. – Micro Frontends 什么是微前端 微前端是一种类似于微服务的架构&#xff0c;它将微服务的理念应用于浏览器端&#xff0c;即将 …

GAN和CycleGAN

文章目录1. GAN 《Generative Adversarial Nets》1.1 相关概念1.2 公式理解1.3 图片理解1.4 熵、交叉熵、KL散度、JS散度1.5 其他相关&#xff08;正在补充&#xff01;&#xff09;2. Cycle GAN 《Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Ne…

Spring事务Spring整合MyBatis

Spring整合MyBatis 在整合之前需要保证mybatis、springframework、mybatis-spring、spring-jdbc的包都已经导入 并且要根据官网提示保证mybatis、springframework、mybatis-spring版本相对应&#xff0c;否则会产生冲突报错 maven依赖如下&#xff1a; <!-- Spring Web…

SAS应用入门学习笔记6

SQL (SAS): Features&#xff1a; 1&#xff09;不需要在每个query中重复调用每个SQL&#xff1b; 2&#xff09;每个statement都是独立去完成的&#xff1b; 3&#xff09;我们是没有proc print和proc sort语句的&#xff1b;&#xff08;order by&#xff09; key synta…

vue3的shallowReactive和shallowRef,readonly和shallowReadonly

shallowReactive&#xff1a;只处理对象最外层属性的响应式&#xff08;浅响应式&#xff09; <template><span>姓名&#xff1a;{{name}}</span><span>年龄&#xff1a;{{age}}</span><span>职业&#xff1a;{{salary.job.num}}</spa…

JAVA SE复习(第5章 面向对象(上))

本文笔记来自硅谷柴林燕老师的笔记 只为自己看笔记方便使用 不做他用5.1 面向对象编程5.1.2 类和对象1、什么是类类是一类具有相同特性的事物的抽象描述&#xff0c;是一组相关属性和行为的集合。属性&#xff1a;就是该事物的状态信息。行为&#xff1a;就是在你这个程序中&am…

springboot集成kafka

选择特定版本spring-kafka官方使用文档 进入官网&#xff1a;https://spring.io/ 选择自己使用版本 点进去后按照 /2.7.0/reference/html/ 路径点进去就能看到想要版本的文档了

C++实现线程池

C实现线程池一、前言二、线程池的接口设计2.1、类封装2.2、线程池的初始化2.3、线程池的启动2.4、线程池的停止2.5、线程的执行函数run()2.6、任务的运行函数2.7、等待所有线程结束三、测试线程池四、源码地址总结一、前言 C实现的线程池&#xff0c;可能涉及以下知识点&#…

JVM - 垃圾回收

目录 垃圾回收基础和根搜索算法 垃圾回收概述 根搜索算法 引用分类 垃圾回收基础(跨代引用、记忆集、写屏障、判断垃圾的步骤、STW) 跨代引用 记忆集(Remembered Set) 写屏障 判断是否垃圾的步骤 GC类型 Stop-The-World 垃圾收集类型 判断类无用的条件 垃圾回收算…

Mybatis源码(2) - SqlSessionTemplate的介绍及创建过程

0. 前言1. Spring对SqlSessionTemplate的管理1.1. SqlSessionTemplate的创建&#xff1a;1.2. MapperProxy中sqlSession的来源&#xff1a;2. SqlSessionInterceptor中的getSqlSession0. 前言 众所周知&#x1f60f;:MyBatis通过SqlSessionFactory 创建SqlSession去调用Executo…

在VMware17 Pro中设置创建虚拟机Ubuntu 20

在VMware17 Pro中设置创建虚拟机Ubuntu 200 前言1 安装Ubuntu 20步骤0 前言 书接上回&#xff0c;安装好了VMware17 Pro之后&#xff0c;就是安装虚拟机了&#xff0c;前提是下好了系统安装包&#xff0c;以Ubuntu 20为例 1 安装Ubuntu 20步骤 首先点击创建新的虚拟机 新建…

利用NAS免费部署动态解析实现内网穿透

‍ 想要从外网访问家中的NAS等设备&#xff0c;一般来说我们需要知道家中路由器的公网IP。 现在固定的公网IP基本上很难免费申请到了&#xff0c;但是一般来说运营商可以免费提供一个动态变化的公网IP&#xff1a;当路由设备重启时&#xff0c;运营商会给你重新分配一个新的I…

PHP加载3D模型【WebGL】

这是另一篇关于如何使用 PHP加载 3D 模型的文章。 在这里&#xff0c;我使用 Laravel 作为后端及其存储。 我在前端使用 Three.Js 库来渲染和显示 3D 模型。 我将向您展示如何上传 3D 模型以及如何从 Laravel 存储加载 3D 模型。 请仔细完成以下步骤。 大家可以在评论区提出任何…