【Java基础】之进程与线程

进程与线程

  • 1. 线程与进程
    • 1.1 概念
    • 1.2 区别与联系
  • 2. 线程的5种状态和切换
    • 2.1 简单介绍
    • 2.2 状态切换
      • 2.2.1 重点情况
  • 3. 线程中常见的方法
  • 4. 线程池

1. 线程与进程

1.1 概念

进程:资源分配的基本单元,如QQ音乐

线程:资源调度的基本单元,如QQ音乐中的播放功能

1.2 区别与联系

①联系:

线程包含在进程里面,多个线程共享一个进程的内存空间;
进程之间是相互独立的,所以进程之间想要互相通信就得借助一些手段才可以;

②区别: 回答点——>地址空间、开销、并发性、内存、健壮性
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。

地址空间

  • 进程之间各自独立,而多个线程之间是共享进程的地址空间;
  • 线程有自己堆栈和局部变量;

开销

  • 进程的上下文切换时间开销消耗资源大,效率差;
  • 线程由于共享一个地址空间,所以线程之间的切换非常快;

并发性

  • 进程的并发性低;
  • 线程的并发性高;

内存:

  • 系统在运行的时候会为每个进程分配不同的内存空间;
  • 而对线程而言,除了 CPU 外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源;

健壮性

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

其他:

  • 每个独立的进程有一个程序运行的入口、顺序执行序列和程序的出口
  • 但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制;

2. 线程的5种状态和切换

线程的生命周期一共分为五个部分,分别是:新建,就绪,运行,阻塞,死亡

2.1 简单介绍

  • 新建状态(New): 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()
  • 就绪状态(Runnable): 此时线程正在就绪队列中排队等候得到CPU资源;(线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。)处于就绪状态的线程,随时可能被CPU调度执行。
  • 运行状态(Running): 线程获得CPU资源正在执行,此时除非此线程自动放弃CPU资源或者有优先级更高的线程进入,线程将一直运行到结束。需要注意的是,线程只能从就绪状态进入到运行状态。
  • 阻塞状态(Blocked): 阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程重新进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:线程阻塞态的具体分类
    • (01) 等待阻塞 – 通过调用线程的wait()方法,让线程等待某工作的完成;
    • (02) 同步阻塞 – 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;
    • (03) 其他阻塞 – 通过调用线程的sleep()join()发出了I/O请求时,线程会进入到阻塞状态;
      sleep()状态超时join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态
  • 死亡状态(Dead): 当线程执行完毕或被其它线程杀死,线程就进入死亡状态,这时线程不可能再进入就绪状态等待执行。
    • ​ 自然终止:正常运行run()方法后终止
    • ​ 异常终止:调用stop()方法让一个线程终止运行,该线程结束生命周期。

2.2 状态切换

在这里插入图片描述注意:线程只能从就绪态运行态

2.2.1 重点情况

运行——>阻塞

  • 调用wait()方法,等待某事件发生(等待阻塞);
  • 获取synchronized锁失败,(被其他线程正在使用)(同步阻塞);
  • 发生I/O请求(等待用户输入)、调用sleep()或join()方法(其他阻塞)

阻塞——>就绪

  • sleep()、join()等待线程终止或者超时;
  • I/O处理完毕时,线程重新转入就绪状态。

3. 线程中常见的方法

请大家看这篇博客:线程中常见的方法

4. 线程池

  • 概念:一种多线程的处理形式,管理多个线程;

  • 主要思想:在进程开始时创建一定数量的线程,并加到池中以等待工作。当服务器收到请求时,它会唤醒池内的一个线程(如果有可用线程),并将需要服务的请求传递给它。一旦线程完成了服务,它会返回到池中再等待工作。如果池内没有可用线程,那么服务器会等待,直到有空线程为止。

  • 目的减少资源的消耗,提高对资源的利用率

    解释
    java线程的创建非常昂贵,需要JVM和OS(操作系统)互相配合完成大量的工作。而java高并发频繁的创建和销毁线程的操作是非常低效的,如何降低java线程的创建成本,就必须要使用到线程池。

  • 使用线程池的优点

    • 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
    • 提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。
    • 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
  • 线程池的七个参数

    • corePoolSize:核心线程数,线程池正常情况下保持的线程数,大户人家“长工”的数量
    • maximumPoolSize:最大线程数,当线程池繁忙时最多可以拥有的线程数,大户人家“长工”+“短工”的总数量。
    • keepAliveTime:空闲线程存活时间,没有活之后“短工”可以生存的最大时间。
    • TimeUnit:时间单位,配合参数 keepAliveTime一起使用,用于描述参数 keepAliveTime的时间单位。
    • BlockingQueue:线程池的任务队列,用于保存线程池待执行任务的容器。
    • ThreadFactory:线程工厂,用于创建线程池中线程的工厂方法,通过它可以设置线程的命名规则、优先级和线程类型。
    • RejectedExecutionHandler:拒绝策略,当任务量超过线程池可以保存的最大任务数时,执行的策略。

参考博客:线程池详解:线程池概念以及架构 (baidu.com)

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

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

相关文章

第38期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大型语言模型(LLM)等安全领域应用的知识。在这里,您可以…

泰迪智能科技生成式人工智能(AIGC)实验室解决方案

AIGC(Artificial Intelligence Generated Content,生成式人工智能)是一种新的人工智能技术,指的是利用人工智能技术来生成内容。这种技术可以自动生成文本、图像、音频和视频等多种类型的内容,而且内容的质量较高&…

Python武器库开发-武器库篇之pdf文件暴力破解(五十二)

Python武器库开发-武器库篇之pdf文件暴力破解(五十二) PDF(Portable Document Format,便携式文档格式)是由Adobe公司开发的一种文件格式。PDF文件被广泛用于以可靠方式共享和传输电子文档。它能够保留文档的原始格式,包括字体、图…

基于YOLOv8的船舶目标检测系统(Python源码+Pyqt6界面+数据集)

博主简介 AI小怪兽,YOLO骨灰级玩家,1)YOLOv5、v7、v8优化创新,轻松涨点和模型轻量化;2)目标检测、语义分割、OCR、分类等技术孵化,赋能智能制造,工业项目落地经验丰富; …

KYOSAN电源维修RFK150ZDTG1电源控制器BKW-100

维修范围:刻蚀、RIE、平行板、ICP、pecvd、射频溅射、CVD 和PVD等系统,工业系统中感应加热和电介质加热设备的电源,烘干、塑化、接、硅晶体生长和平板显示器领域应用电源,直流偏压和硬镀膜,信息技术设备(ITE)及轻工业系…

医院安全(不良)事件报告系统源码,不良事件处理的全过程管理,实现11大类不良事件类型的报告上报、流转审批、跟踪改进及统计分析功能。

医院安全(不良)事件报告系统源码,不良事件上报系统源码,PHP源码 医院安全(不良)事件报告系统提供11大类不良事件的上报、事件审核处理、时间按分析、事件跟踪与持续改进,事件提醒、权限控制、外…

qiankun子应用静态资源404问题有效解决(遇到了http请求静态文件404、css文件引用图片无法显示、svg图片转换成 base64无法显示等问题)

在👉🏻 qiankun微前端部署👈🏻这个部署方式的前提下,遇到的问题并解决问题的过程 >> 问题现象 通过http请求本地的静态json文件404 css中部分引入的图片无法显示 >> 最开始的解决方式 在👉…

【数据结构】双向带头循环链表实现及总结

简单不先于复杂&#xff0c;而是在复杂之后。 文章目录 1. 双向带头循环链表的实现2. 顺序表和链表的区别 1. 双向带头循环链表的实现 List.h #pragma once #include <stdio.h> #include <assert.h> #include <stdlib.h> #include <stdbool.h>typede…

mycat-encrypt-server如何支持模糊查询的

最近在研究数据库加密&#xff0c;看到了mycat-encrypt-server项目&#xff0c;看了一下代码&#xff0c;说是支持加密字段的模糊查询&#xff1a; private void parserBinaryExpression(Expression expression, Set<String> columns, String tableAlias, String tableNa…

代码随想录算法训练营第36天 | 435.无重叠区间 763.划分字母区间 56.合并区间

无重叠区间 这道题按左边界排序和右边界排序都是可以的。主要就是要统计出不重合区间的数目。如果按照右区间排序&#xff0c;下面这张图十分形象&#xff1a; 这样去掉一组重叠区间后&#xff0c;剩下的那个区间它的右端点最小&#xff0c;能让后面产生尽量多的不重叠空间。 …

用GPT写PHP框架

参考https://www.askchat.ai?r237422 写一个mvc框架 上面是简单的案例&#xff0c;完整的PHP框架&#xff0c;其核心通常包含以下几个关键组件&#xff1a; 1. 路由&#xff08;Routing&#xff09;&#xff1a;路由组件负责解析请求的URL&#xff0c;并将其映射到相应的控制…

MySQL原理(三)锁定机制(1)综述

一、介绍&#xff1a; 1、锁的本质 业务场景中存在共享资源&#xff0c;多个进程或线程需要竞争获取并处理共享资源&#xff0c;为了保证公平、可靠、结果正确等业务逻辑&#xff0c;要把并发执行的问题变为串行&#xff0c;串行时引入第三方锁当成谁有权限来操作共享资源的判…

嵌入式——模拟/数字转换器(ADC)补充

目录 一、ADC简介 二、ADC功能 1.电压输入范围 2.输入通道 3. 转换顺序 &#xff08;1&#xff09;规则序列 &#xff08;2&#xff09; 注入序列 4.触发源 5. 转换时间 &#xff08;1&#xff09; ADC时钟 &#xff08;2&#xff09; 采样时间 6. 数据寄存器 &am…

ETL怎么实现文件处理

在现代企业及各类组织的日常运作中&#xff0c;数据作为一种关键的信息资源&#xff0c;其管理和分析能力直接影响到决策效率与准确性。文件作为数据的主要载体&#xff0c;承载着从运营报告、客户记录、交易明细等各种类型的数据信息。这些海量且多样的文件数据在未经处理的情…

母排设计时没有柜体3D数据?来试试SuperPanel的钣金功能!

CAD版SuperPanel软件能够助力用户快速、准确地设计和修改母排&#xff0c;同时快速输出加工图纸和数控加工代码。在壳体外购&#xff0c;没有柜体3D数据的情况下&#xff0c;如何轻松进行母排设计&#xff1f;一起来学习利驰数字母排的钣金功能吧&#xff01; SuperPanel的钣金…

通过实测,让你从书客、明基、好视力中选出最优质的护眼台灯

眼睛是我们与世界接触的最重要媒介之一&#xff0c;让我们能够观察到世间万物的美好。然而&#xff0c;由于种种原因&#xff0c;很多人都戴上了眼镜&#xff0c;这无疑在我们与世界的接触中增加了一层隔阂&#xff0c;给生活带来了诸多不便。为了缓解或避免近视的发生&#xf…

【前端-VUE+TS】Vue3组件化-下(五)

一. 插槽的使用 1.1. 认识插槽slot 在开发中&#xff0c;我们会经常封装一个个可复用的组件&#xff1a; 前面我们会通过props传递给组件一些数据&#xff0c;让组件来进行展示&#xff1b;但是为了让这个组件具备更强的通用性&#xff0c;我们不能将组件中的内容限制为固定的d…

STM32F407ZGT6——实验9-4 通用定时器脉冲计数实验

一、配置路线 二、问题及反思 配置的时候误以为需要先把【输入捕获配置】了再去配置【从模式】&#xff0c;后面验证了这样配置没办法产生预期的效果。 代码如下&#xff1a;void gtim_timx_cnt_chy_init(uint16_t psc, uint16_t arr) void gtim_timx_cnt_chy_init(uint16_t…

MyBatis 源码系列:MyBatis 解析配置文件、二级缓存、SQL

文章目录 解析全局配置文件二级缓存解析解析二级缓存缓存中的调用过程缓存中使用的设计模式 解析SQL 解析全局配置文件 启动流程分析 String resource "mybatis-config.xml"; //将XML配置文件构建为Configuration配置类 reader Resources.getResourceAsReader(re…

【3分钟开服】幻兽帕鲁服务器一键部署保姆教程

在帕鲁的世界&#xff0c;你可以选择与神奇的生物「帕鲁」一同享受悠闲的生活&#xff0c;也可以投身于与偷猎者进行生死搏斗的冒险。帕鲁可以进行战斗、繁殖、协助你做农活&#xff0c;也可以为你在工厂工作。你也可以将它们进行售卖&#xff0c;或肢解后食用。 引用自&#x…