【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)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

私域必看:让你事半功倍的多微信高效管理方法

随着私域运营的需求不断增长,对于使用微信进行运营的企业或个人,高效地管理微信变得越发重要。今天就分享一些高效管理多个微信账号的实用方法,帮你节省时间。 1.巧用标签和分组 微信的标签和分组功能,相信很多人都使用过&#xf…

AtCoder Beginner Contest 338 --- D - Island Tour -- 题解

D - Island Tour 题目大意 思路解析&#xff1a; 可以发现 1->2->4 整体减1变为5->1->3&#xff0c; 其中2->4的距离等于1->3的距离 其中1->2的距离不等于5->1的距离&#xff0c;则只有当[xj - i] < 0后的xj - > xj1 和 xj -> xj-1的距离才会…

电子液晶屏幕生产厂污废水处理需要哪些工艺设备

随着电子液晶屏幕行业的不断发展&#xff0c;污废水处理成为了一个重要的环保问题。为了达到合规性排放要求&#xff0c;并保护环境&#xff0c;厂家需要采取一系列工艺设备来处理污废水。 首先&#xff0c;常见的一种处理工艺是物理与化学处理。物理处理包括预处理与固液分离&…

基于go mod模式创建项目最佳实践

希望能带给你成功的喜悦&#xff01; 除go get、vendor这两种方式外&#xff0c;Go版本在1.11之后推出了go module模式来管理依赖&#xff0c;使用go mod时下载的依赖文件在$GOPATH/pkg/mod/下。本文以两种办法介绍如何创建go mod项目。 目录 goland开启玩法 本地手动创建项目…

Java二维码图片识别

前言 后端识别二维码图片 代码 引入依赖 <dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.2.1</version></dependency><dependency><groupId>com.google.zxing<…

C语言指针进阶之四-函数指针的使用之回调函数及库函数qsort函数详解(详解)

目录 1.回调函数 1.1引入 1.2回调函数的使用&#xff0c;加减乘除计算器改造 2.回调函数的应用-qsort函数 实例1&#xff1a;整型数组排序 实例2&#xff1a;结构体排序 ①按照整型数据来排序&#xff0c;这里是按照年龄来排序 ②按照名字来排序&#xff0c;也就是比较…

Java 面试题之 IO(一)

字节流 文章目录 字节流InputStream&#xff08;字节输入流&#xff09;OutputStream&#xff08;字节输出流&#xff09; 文章来自Java Guide 用于学习如有侵权&#xff0c;立即删除 InputStream&#xff08;字节输入流&#xff09; InputStream用于从源头&#xff08;通常是…

【Mac系统PyCharm连接至Linux服务器,实现本地与服务器的实时交互】

Mac系统PyCharm连接至Linux服务器&#xff0c;实现本地与服务器的实时交互 0、目录 1、动机2、说明3、PyCharm 连接Linux服务器操作过程 3.1 连接服务器3.2 验证连接服务器是否成功3.3 查看Linux服务器文件构成3.4 本地与Linux服务器上传内容3.5 从PyCharm的terminal进入到刚…

华为OD-华为机试精讲500篇系列文章目录介绍(持续补充ing)

目录 背景介绍 什么是华为OD&#xff1f; OD现状 OD趋势 华为OD机考刷题攻略 1、刷题资料&#xff1a;投递岗位通过筛选后提供 2、注意事项&#xff1a; 真题代码目录 背景介绍 经济下行的这几年&#xff0c;每个人都感同身受&#xff0c;如何让自己在芸芸众生中脱颖而…

无心剑中译莎士比亚《可否将你比夏天》

莎士比亚十四行诗第18首 Sonnet 18 可否将你比夏天 Shall I compare thee to a summer’s day? Thou art more lovely and more temperate: Rough winds do shake the darling buds of May, And summer’s lease hath all too short a date: Sometime too hot the eye of he…

2024美赛算法预测-1一个强大算法模型,随机森林!!

大家好&#xff0c;今儿咱们来说说关于随机森林的一些核心点~ 首先&#xff0c;随机森林是一种集成学习方法&#xff0c;通过组合多个决策树来进行预测。每个决策树都是在不同的数据子集上训练的&#xff0c;同时引入了随机性&#xff0c;使得每棵树都有差异。 最终的预测结果…

transformer架构的理解

一、transformer 架构 如上图所示&#xff0c;transformer&#xff08;形状像变压器&#xff1f;或者翻译成变形金刚&#xff0c;由不同模块拼装而成&#xff09;的架构左边是n个结构体相同的编码器&#xff08;例如&#xff0c;原论文是6个编码器的串联&#xff09;&#xff0…