热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【多线程】基础理论知识

上一个系列是SpringCloud入门系列,以后肯定会写一期进阶系列,但是目前更新的是多线程系列。多线程的重要性不用多说,高并发在现在的生活无处不在。618,双11,1230

上一个系列是SpringCloud入门系列,以后肯定会写一期进阶系列,但是目前更新的是多线程系列。

多线程的重要性不用多说,高并发在现在的生活无处不在。618,双11,12306,支持的并发量那都不知道是多大,说再多遍也不嫌多,是非常非常非常倾佩这些团队的。

本篇文章重点是带大家了解下进程和线程方面的基础理论知识,涉及到的概念都是简单但是又很实用的,一些可能没涉及到的概念也会在后面的文章中写出来。

进程

进程的简单概念

在进程模型中,计算机所有可运行的软件,通常也包括操作系统,被组织成若干顺序进程,简称进程(process),一个进程就是一个正在执行程序的示例。

大白话来说,一个进程就相当于我们启动的项目,或者说打开任务管理器的时候看到的这些应用都是进程。一个进程主要包括程序计数器、寄存器和变量的当前值

【多线程】基础理论知识
image

这里还需要讲下的一个概念就是守护进程

停留在后台处理的进程称之为守护进程。

进程的状态

进程的状态有三个状态,就绪、运行、阻塞。就绪就是能运行,但是还没运行,CPU被其它进程占用了;运行就是该时刻进程已经实际占用CPU在运行了;阻塞基本上等于暂停了,除非有外界因素干扰,不然该进程就不能运行了。

拿做核酸来讲,医护人员就是CPU,正在做核酸的人就是运行态,在后面排队的就是就绪态,没有人逼他自己不想做根本没有来排队就是阻塞态。

【多线程】基础理论知识
image

值得注意的是,这三种状态是可以互相转换

【多线程】基础理论知识
image
  • 运行 》》 阻塞: 当系统发现进程无法再运行下去的时候,或者认为终止进程后就会发生该转换。
  • 运行 《 》 就绪: 这两个转换大多数时候是一体的,主要是由系统进程调度程序决定的,进程对于调度的变化基本上是感知不到的。当系统认为这个进程已经长时间占用CPU了,那么会根据一定的算法 重新分配CPU的时间片,此时就会伴随着状态的转变。
  • 阻塞 》》就绪: 当进程等待的一个外部事件发生时就会发生次转换,通俗就是,比如大规模核酸检测,社区上门提醒,就会去排队。

进程间的通信方式

进程间的通信方式有8种,但是忘记在哪本书上看到的这8种的概念,网上虽然有解释,但是不太权威,就没写出来,各位小伙伴暂时就先了解下是哪8种即可。

无名管道,有名管道,高级管道,消息队列,信号量,信号,共享内存和套接字。

【多线程】基础理论知识
image

线程

线程基本概念

对于线程,查了很久也没有一个明确的概念,甚至再《现代操作系统中》也是模糊的概念,迷你进程(称为线程)。

用Java程序通俗的来说呢,就是一个程序就是一个进程,然后main方法就是该进程的主线程,然后在之后我们会创建多个线程。

我们知道,每个进程都有一个地址空间和一个控制线程,这里的主线程是不是控制线程有待考量。

线程的状态

相较于进程而言,线程的状态有五种。

  • New: new是指新建了一个线程,但是还未启动。对应到代码就是只是new了一个Thread后,该线程就处于新建状态,此时仅由JVM为其分配内存,并初始化其成员变量的值

  • Runnable: 当线程调用了start()方法后,该线程就处于就绪状态,在等待cpu时间片。在虚拟机的表现就是Java虚拟机会为其创建方法调用栈和程序计数器,等待调度运行

  • Running: 顾名思义就是程序处于运行状态,对应到代码就是处于就绪状态的线程获得了CPU,开始执行run()方法的线程执行体,则该线程处于运行状态。

  • Blocked: 就是我们经常听到的阻塞状态,是指线程因为某种原因放弃了cpu使用权,即让出了cpu timeslice(时间片),暂时停止运行。这种状态会一直维持到线程进入可运行(runnable)状态,才有机会再次获取到cpu时间片,从而再次转到运行(running)状态

  • Dead: 线程结束后的状态就是死亡状态

对于阻塞状态而言,分为3种:

  • 等待阻塞: 运行中的线程中的线程调用了object.wait()方法,JVM会把该线程放入等待队列中,使得本线程进入阻塞状态。

  • 同步阻塞: 运行中线程在获取对象的同步锁时,若该同步锁被别的线程占用,大白话就是说拿不到锁,JVM会把该线程放入锁池(lock pool)中。

  • 其它阻塞: 运行中的线程执行Thread.sleep(long ms)后者t.join()方法,亦或是发出了I/O请求时,JVM会把线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。

对于线程的Dead状态而言,方式有以下三种:

  • 正常结束,就是run()或者call()方法执行完成
  • 异常结束,线程在运行的过程中抛出一个未捕获的Exception或Error
  • 调用stop()方法,直接调用该线程的stop()方法来结束线程,但是这种方法容易导致死锁,所以一般不建议使用
【多线程】基础理论知识
image

线程间的通信方式

线程间的通信方式主要是由3种方式,共享内存、消息传递和管道流。

  • 共享内存:java里面一般是使用volatile共享内存
  • 消息传递:java里面会使用的方式如wait/notify , join 等方法。
  • 管道流:管道输入/输出流的形式

其它

进程和线程的区别

多进程就是操作系统中同时运行的多个程序,多线程在同一个进程中同时运行的多个任务。

根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位

资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的

影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行

【多线程】基础理论知识
image

线程不安全

在《Java并发编程实战》中有这么一句话

当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替进行,并且不需要额外的同步及调用方代码不必作其它的协调,这个类的行为仍然是正确的,那么成这个类是线程安全的。

通俗一点来说,要想代码线程安全,其实就是保证状态的访问时不出错的,对象的状态一般情况下指的是数据。但是数据大多数情况都是共享可变的。

顾名思义,共享指的是线程之间是可以访问到这个变量,可变是是指数据的值是可以被更改的,不是写死的。

资源

什么是资源,在《现代操作系统》中的定义是

我们把这里需要排他性使用的对象称为资源。资源可以是硬件设备(如蓝光驱动器)或者是一组信息(如数据库中一个加锁的记录)……简单来说,资源就是随着时间的推移,必须能获得、使用以及释放的任何东西

对于这个资源,在java程序里面是锁呢,还是指的共享变量呢,我个人觉得更像是锁,不知道各位小伙伴怎么看。

并行和并发

并发是指同一个时间段内多个线程在执行任务,一般是交替执行;并行是指同一个时刻下多个线程同时工作。

在操作系统的层次来看,如果多个线程能同时被多个CPU执行,这样就是并行。并发是多个线程被一个CPU按照某一算法切换执行

创作不易,如果对你有帮助,欢迎点赞,收藏和分享啦!


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 深入理解线程、进程、多线程、线程池
    本文以QT的方式来走进线程池的应用、线程、进程、线程池、线程锁、互斥量、信号量、线程同步等的详解,一文让你小白变大神!为什么要使用多线程、线程锁、互斥量、信号量?为什么需要线程 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • Spring Batch中多线程配置及实现例子
    本文介绍了在Spring Batch中开启多线程的配置方法,包括设置线程数目和使用线程池。通过一个示例演示了如何实现多线程从数据库读取数据并输出。同时提到了在多线程情况下需要考虑Reader的线程安全问题,并提供了解决方法。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
  • vb.net不用多线程如何同时运行两个过程?不用多线程?即使用多线程,也不会是“同时”执行,题主只要略懂一些计算机编译原理就能明白了。不用多线程更不可能让两个过程同步执行了。不过可 ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
author-avatar
躲避世界2502862687
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有