线程与进程基础

server/2024/12/16 12:15:19/

文章目录

  • 前言
  • 一、 线程与进程
    • 1.1 什么是线程与进程?
    • 1.2 并发与并行
    • 1.3 同步调用与异步调用
    • 1.4 为什么要使用多线程?

前言


在学习juc前,需要先对进程和线程之间整体有一个认知。我们之前或多或少接触过,一些特别高大上的概念,比如多线程,高并发 之类的。该文就是先对这些概念整体理清,为后续学习扫清障碍。


一、 线程与进程

1.1 什么是线程与进程?

进程

  • 进程是用来存放数据与指令等运行程序的组成部分,然后指令运行的时候还需用到磁盘、IO设备,网络等,其中进程就是用来加载指令,管理内存·,管理IO的。

  • 程序运行的时候,从磁盘 -> 内存就代表一个进程开启了

  • 进程可以看作一个程序的示例,比如我们打开任务管理器:

在这里插入图片描述

这表明,对于应用来说,可以运行一个或者多个进程。

线程

  • 一个进程包括多个线程
  • 一个线程就是一个指令流,将指令流的一条条指令以一定顺序交给CPU执行
  • Java中,线程是最小的调度单位,进程作为资源分配的最小单位。windows中,进程不活动,只是作为线程的容器。

二者对比 :

  • 进程拥有共享的资源,比如内存空间的,供子集线程共享
  • 进程间的通信较为复杂
    • 同一台计算机的进程通信称为IPC,比如套接字、消息队列等。
    • 不同计算机的通信要通过网路,并遵守共同的协议,比如http等。
  • 线程通信比较简单,因为它们可以共享进程内的内存,一个例子是多个线程访问一个共享变量。
  • 线程更轻量级,上下文切换成本较低。

1.2 并发与并行


  • 并发:两个及两个以上的任务在同一时间段执行
  • 并行:两个及两个以上的任务在同一时刻执行

并发

​ 在单核cpu中,线程实际是串行执行的。操作系统中的组件,叫做任务调度器,将cpu的时间片(windows下接近15ms)分给不同的线程使用,只是由于cpu在线程间的切换非常快,导致体感上是同时运行的

​ 总结一句话:微观串行,宏观并行,但是,实际上还是串行。

并行

​ 在多核cpu中,每个核心可以处理一个线程,这样就可以真正意义上实现并行,即同一时刻,同时运行多个线程。

如图:

在这里插入图片描述

在这里插入图片描述

1.3 同步调用与异步调用

注意
代码中的Constants.MP4_FULL_PATH就理解为一个文件即可。

该代码作用就是花时间读取一个文件。

  • 同步调用

在这里插入图片描述

  • 异步调用

在这里插入图片描述

从运行结果,可以看出来,异步调用是通过一个Thread-0的线程执行的。

从上面的运行结果可以得到两者的含义。


同步调用:发出一个调用之后,结果没有返回的话,该调用就不可以返回,一直等待。

异步调用:调用在发出后,不用等待返回结果,调用直接返回。


其实简单来说:
异步调用就是在main线程里面新开一个线程,并且新开的线程执行与否对于主线程接下来往下执行没有影响。
同步调用就是一直只执行当前线程呗,不开其它的线程。

根据这个,我们就可以引出下面的多线程:

  • 多线程的作用

​ 多线程可以让方法执行变成异步的(即不要干等着)。比如读取磁盘文件时,需要5秒,那如果我们不使用多线程,这5秒什么都做不了只能干等着。

1.4 为什么要使用多线程?

  • 在单核时代,使用多线程可以提高cpu和io系统的运行效率,如果只运行了一个java进程的情况下,当线程进行读取io的操作,此时线程被阻塞。如果没有多线程,那么此时整个进程都被阻塞, 无法使用cpu,系统整体效率只有50%。但是如果使用多线程的话,一个线程阻塞,其它线程还可以继续访问,大大提高系统运行效率。但是需要理解的是,单核中,多线程并不起到减少时间的作用。(单核只作了解)

  • 在多核时代。多线程主要是为了提高进程利用多核cpu的能力。

eg : 处理一个复杂的任务,如果只有一个线程,那么只有一个核心被利用到。失去了多核的作用,但是多个线程就可以同时使用多个核心同时处理任务,提高了解决任务的效率,时间约等于(单核时执行的时间 / cpu核心数)。

实例:

java">@Benchmark
public int c() throws Exception {int[] array = ARRAY;FutureTask<Integer> t1 = new FutureTask<>(()->{int sum = 0;for(int i = 0; i < 250_000_00;i++) {sum += array[0+i];}return sum;});FutureTask<Integer> t2 = new FutureTask<>(()->{int sum = 0;for(int i = 0; i < 250_000_00;i++) {sum += array[250_000_00+i];}return sum;});FutureTask<Integer> t3 = new FutureTask<>(()->{int sum = 0;for(int i = 0; i < 250_000_00;i++) {sum += array[500_000_00+i];}return sum;});FutureTask<Integer> t4 = new FutureTask<>(()->{int sum = 0;for(int i = 0; i < 250_000_00;i++) {sum += array[750_000_00+i];}return sum;});new Thread(t1).start();new Thread(t2).start();new Thread(t3).start();new Thread(t4).start();return t1.get() + t2.get() + t3.get()+ t4.get();
}
@Benchmark
public int d() throws Exception {int[] array = ARRAY;FutureTask<Integer> t1 = new FutureTask<>(()->{int sum = 0;for(int i = 0; i < 1000_000_00;i++) {sum += array[0+i];}return sum;});new Thread(t1).start();return t1.get();
}

运行结果:

在这里插入图片描述

上述代码含义就是 :

4个线程(t1、t2、t3、t4),每个线程调用方法执行2500万次,打印信息中是c开头的。
d开头方法是一个方法调用1亿次。

c为异步调用,d为同步调用,从结果来看,c方法的效率显著高于d方法(Score越小,效率越高)。

但是如果是在单核cpu中的话,不会出现性能的提升,因为单核的本质上还是串行,并不会产生并行的效果。


http://www.ppmy.cn/server/150622.html

相关文章

Kubernetes 常用操作大全:全面掌握 K8s 基础与进阶命令

Kubernetes&#xff08;简称 K8s&#xff09;作为一种开源的容器编排工具&#xff0c;已经成为现代分布式系统中的标准。它的强大之处在于能够自动化应用程序的部署、扩展和管理。在使用 Kubernetes 的过程中&#xff0c;熟悉常用操作对于高效地管理集群资源至关重要。本文将详…

循环神经网络RNN笔记

《动手学深度学习》-RNN 0 引言 默认数据都来自于某种分布&#xff0c; 并且所有样本都是独立同分布的 &#xff08;independently and identically distributed&#xff0c;i.i.d.&#xff09;。 然而&#xff0c;大多数的数据并非如此。 例如&#xff0c;文章中的单词是按顺…

任务5 Web服务配置与管理

Web服务概述 Web服务简介 当今人们获取和传播信息的主要方式之一。 Web服务提供的资源多种多样&#xff0c;可能是简单的文本&#xff0c;也可能是图片、音频和视频等多媒体数据。 常用的浏览器有Chrome、Internet Explorer&#xff0c;以及Firefox等。 手机等移动设备成为…

Oracle 临时表空间管理与最佳实践

Oracle 临时表空间管理与最佳实践 内容摘要 本文深入探讨了Oracle数据库中临时表空间的管理和最佳实践。主要内容包括&#xff1a; 临时表空间的概述及其在Oracle 19c多租户架构中的特点临时表空间组的优势及其创建方法非临时表空间组的临时表空间日常维护操作命令临时表空间…

【数据分析】数据分析的职业准则

文章目录 数据分析的基本概念什么是数据分析数据分析分类数字化工作现代数据分析 职业道德行为准则职业道德与行为准则 大数据立法安全隐私原则隐私与安全GDPR准则我国相关法律 数据分析的基本概念 什么是数据分析 广州和深圳那个发展潜力更大&#xff1f; 有的读者觉得广州更…

java缓存技术介绍

1. 缓存&#xff08;Cache&#xff09;&#xff1a;一种存储数据的组件&#xff0c;通常位于速度较快的存储介质中&#xff08;如内存&#xff09;&#xff0c;用于临时存储从速度较慢的存储介质&#xff08;如磁盘&#xff09;中读取的数据&#xff0c;以减少访问时间并提高系…

Redis学习笔记之——学习计划

Redis——Remote Dictionary Server&#xff0c;开源、基于内存、速度快、key-value... Redis做为一个高性能的键值存储系统&#xff0c;广泛应用于缓存、会话存储、分布式锁以及其他需要快速访问的数据场景中。熟悉掌握redis&#xff0c;似乎已成为广大码农们必备的一项技能。…

【前端】博客系统(页面设计)

目录 1. 预期效果 2. 实现博客列表页 2.1 实现导航栏 2.2 实现版心 2.3 实现个人信息 2.4 实现博客列表 3. 实现博客正文页 3.1 引入导航栏 3.2 引入版心 3.3 引入个人信息 3.4 实现博客正文 4. 实现博客登录页 4.1 引入导航栏 4.2 实现版心 4.3 实现登录框 5.…