并发编程系列之线程简介

2023-11-06

前言

前几天我们把Java内存模型介绍了下,大家对JMM也有所认识了,从今天我们就开始走进一个我们天天挂在嘴边,听在耳边的东西:线程,对于线程相信大家都不会陌生,当然也有很多小伙伴在开发中或多或少的使用到线程,即使你没有使用过,但是并不代表你的程序中不存在,相反,他是一定会存在的,虽然这有点废话,OK,那我们废话也不多说,今天我们先对线程做个简单的介绍,那么,让我们一起开始新的旅途吧。

什么是线程?

线程是现代操作系统调度的最小单元,也叫轻量级进程,在一个进程中可以创建多个线程,每个线程都拥有自己单独的计数器,堆栈和局部变量等属性,并且能够访问共享的内存变量,处理器在这些线程之间,快速的切换,使用户造成多线程并发执行的错感,其实多线程本质上还是单线程,只是处理器在快速切换线程处理。

Java程序天生就是多线程程序,下面我们以一个main方法为例,我们什么都不做,只是启动一个main方法,看看执行结果:

public static void main(String[] args) {
   // 获取线程管理bean
   ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
   ThreadInfo[] dumpAllThreads = threadMXBean.dumpAllThreads(false, false);
   for (int i = 0; i < dumpAllThreads.length; i++) {
     System.out.println("系统中线程编号:"+dumpAllThreads[i].getThreadId()+" 线程名字:"+dumpAllThreads[i].getThreadName());
   }
 }

执行结果:
系统中线程编号:5 线程名字:Attach Listener
系统中线程编号:4 线程名字:Signal Dispatcher
系统中线程编号:3 线程名字:Finalizer
系统中线程编号:2 线程名字:Reference Handler
系统中线程编号:1 线程名字:main

从上面执行结果我们就能看到main方法在执行的时候,并不是只有一个main线程在执行,还有另外4个线程也在执行(对上面几个线程分被代表什么意思感兴趣的小伙伴可以自己去查阅相关资料)。

为什么要使用多线程?

正确的使用多线程能带来下面几种好处

更多的处理器核心:线程是大多数操作系统调度的基本单元,一个程序运行过程中能够创建多个线程,而一个线程在一个时刻只能运行在一个处理器核心上,假设在单线程环境下,一个线程只能使用一个处理器核心,就算有再多的处理器核心,也还是无法利用同时处理多个线程,所以这个时候多核系统的价值就无法体现出现,而多线程环境下,我们将计算逻辑分配到多个线程上,由多个处理器核心同时处理,显著提高系统的处理效率;

更快的响应时间:我们在处理业务逻辑时,可以将数据一致性不强的操作分给其他线程异步去处理,而尽快的响应用户请求,缩短了响应时间;

更好的编程模型:Java为多线程编程提供了一套完整的,良好的编程模型,使开发人员更快速方面的开发有安全保障的业务程序;

线程的优先级

现代操作系统基本采用时分的形式调度运行的线程,操作系统会分出一个个时间片,线程会分配到若干时间片,当线程的时间片用完就会触发线程调度,并等待下次分配,线程分配到的时间片多少决定了线程使用处理器资源的多少,而线程优先级就是决定线程能分配资源的多少。

在JAVA线程中,通过一个int priority来控制优先级,范围为1-10,其中10最高,默认值为5,优先级越高的线程分配到的时间片的数量越多。

设置线程优先级时的2个规则:

  • 如果线程是频繁阻塞的线程,那么就需要设置较高的优先级,给予足够的时间来处理该线程,防止线程阻塞导致进程崩溃;

  • 对于偏重计算(使用较多的CPU时间)的线程,要设置较低的优先级,防止处理器被独占;

关于优先级的相关源码如下:

线程优先级默认分3级,1-5-10

   /**
    * The minimum priority that a thread can have.
    */
   public final static int MIN_PRIORITY = 1;

  /**
    * The default priority that is assigned to a thread.
    */
   public final static int NORM_PRIORITY = 5;

   /**
    * The maximum priority that a thread can have.
    */
   public final static int MAX_PRIORITY = 10;

设置优先级:

public final void setPriority(int newPriority) {
       ThreadGroup g;
       checkAccess();
       if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) {
           throw new IllegalArgumentException();
       }
       if((g = getThreadGroup()) != null) {
           if (newPriority > g.getMaxPriority()) {
               newPriority = g.getMaxPriority();
           }
           setPriority0(priority = newPriority);
       }
   }

线程的状态

线程在运行的生命周期中有6种状态,如下:

public enum State {
       // 初始状态,线程被创建,但是还没有调用start方法
       NEW,
       // 运行状态(运行中和就绪都属于运行状态)
       RUNNABLE,
       // 阻塞状态,锁导致的阻塞
       BLOCKED,
       // 等待状态,当前线程需要等待其他线程动作
       WAITING,
       // 超时等待状态,可以在指定时间内自行返回
       TIMED_WAITING,
       // 终止状态,表示线程执行完毕
       TERMINATED;
   }

线程各个状态之间的转换过程如下图:

守护线程(Daemon)

守护线程是一种支持性线程,因为它主要被用作程序中后台调度以及支持性工作,也就是说,当Java虚拟机中不存在非守护线程时,虚拟机就会执行退出。

使用如下方法将普通线程设置成守护线程:

Thread thread = new Thread();    
   thread.setDaemon(true);

源码如下:

public final void setDaemon(boolean on) {
       checkAccess();
       if (isAlive()) {
           throw new IllegalThreadStateException();
       }
       daemon = on;
   }

 

以上就是今天我们对线程的简介,通过本篇文章,让我们对线程有个概念和认识,方便我们后面内容的展开,感谢阅读,感谢关注!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

并发编程系列之线程简介 的相关文章

  • Java并发编程实战——并发容器之ThreadLocal及其内存泄漏问题

    文章目录 ThreadLocal的简介 ThreadLocal的实现原理 ThreadLocalMap详解 ThreadLocal内存泄漏问题 ThreadLocal的使用场景 ThreadLocal的简介 之前写过用ThreadLocal
  • 并发编程系列之Exchanger

    前言 上面我们介绍了信号量 再来说说交换者 这个东西用的不是很多 所以一般也不被经常关注 但是我们还是最好了解下 下面我将从什么是Exchanger以及如何使用Exchanger两个方面谈谈这个用于线程间协调的工具类 什么是Exchange
  • Java 多线程事务回滚 ——多线程插入数据库时事务控制

    背景 日常项目中 经常会出现一个场景 同时批量插入数据库数据 由于逻辑复杂或者其它原因 我们无法使用sql进行批量插入 串行效率低 耗时长 为了提高效率 这个时候我们首先想到多线程并发插入 但是如何控制事务呢 直接上干货 实现效果 开启多条
  • 源码分析【ReentrantLock】原理

    ReentrackLock底层原理 ReentrackLock介绍 非公平锁VS公平 非公平锁 公平锁 可打断VS不可打断 不可打断 默认 可打断模式 锁超时 条件变量 如何在synchronized和ReentrantLock之间进行选择
  • 一次线上的GC问题排查

    6 19号下午 线上系统出现了一次实时链路数据 不通畅的问题 业务方反应更新的增量数据没有流入到HA3搜索集群 登录机器后检查日志后发现 在周六晚上到周天下午 cr search merge 机器人schema统一 表增量数据猛增 初步估计
  • 什么是ConcurrentHashMap?

    文章目录 什么是ConcurrentHashMap ConcurrentHashMap 的主要特性 ConcurrentHashMap 的用法 ConcurrentHashMap 的实现原理 在什么场景使用ConcurrentHashMap
  • 【2021最新版】Java多线程&并发面试题总结(108道题含答案解析)

    文章目录 JAVA并发知识库 1 Java中实现多线程有几种方法 2 继承Thread类 3 实现Runnable接口 4 ExecutorService Callable Future有返回值线程 5 基于线程池的方式 6 4 种线程池
  • java晋级赛 深入并发编程

    根据黑马java并发编程学习做的笔记 传送门 https www bilibili com video BV16J411h7Rd p 15 java晋级赛 深入并发编程 一 多线程基础 进程与线程 创建线程的方式及运行原理 创建线程的方式
  • 159.并发编程(三):线程池,JUC

    目录 一 线程池 1 线程池的作用 2 手写线程池 3 ThreadPoolExecutor 1 线程池状态
  • java如何正常关闭一个线程

    如何关闭一个线程 调用stop方法 该方法存在一个问题 JDK官方不推荐使用 该方法在关闭线程时可能不会释放掉monitor的锁 所以建议不要使用该方法结束线程 正常关闭 2 1 线程正常结束生命周期 线程运行结束 完成自己的使命之后 就会
  • 如何设计高性能的分布式锁

    什么是分布式锁 在 JVM 中 在多线程并发的情况下 我们可以使用同步锁或 Lock 锁 保证在同一时间内 只能有一个线程修改共享变量或执行代码块 但现在我们的服务都是基于分布式集群来实现部署的 对于一些共享资源 在分布式环境下使用 Jav
  • C/C++基于线程的并发编程(二):线程安全和线程锁

    线程安全 所谓线程安全不是指线程的安全 而是指内存的安全 线程是由进程所承载 所有线程均可访问进程的上下文 意味着所有线程均可访问在进程中的内存空间 这也是线程之间造成问题的潜在原因 当多个线程读取同一片内存空间 变量 对象等 时 不会引起
  • ReentrantLock实现PV操作-模拟多线程竞争数据库连接池资源场景

    使用ReentrantLock Condition模拟PV操作 实现多线程竞争数据库连接池资源 资源耗尽后阻塞等待 归还资源后唤醒阻塞线程的场景 代码中为10个线程竞争5个数据库连接资源 ConnectionPool class 连接池 C
  • Java 线程池的submit的使用与分析.md

    在Java5以后 通过Executor来启动线程比用Thread的start 更好 在新特征中 可以很容易控制线程的启动 执行和关闭过程 还能使用线程池的特性 上一篇我们介绍了线程池的基本用法和特性 我们用的最多的是ExecutorServ
  • 并发编程系列之原子操作实现原理

    前言 上节我们讲了并发编程中最基本的两个元素的底层实现 同样并发编程中还有一个很重要的元素 就是原子操作 原子本意是不可以再被分割的最小粒子 原子操作就是指不可中断的一个或者一系列操作 那么今天我们就来看看在多处理器环境下Java是如何保证
  • ThreadPoolExecutor源码解析

    ThreadPoolExecutor源码解析 一 新建线程池的是构造方法 public ThreadPoolExecutor int corePoolSize int maximumPoolSize long keepAliveTime T
  • 多线程实现事务回滚

    多线程实现事务回滚 特别说明CountDownLatch CountDownLatch的用法 CountDownLatch num 简单说明 主线程 mainThreadLatch await 和mainThreadLatch countD
  • 接口并发性能测试开发之:从测试方案设计、测试策略、指标分析到代码编写,这一篇全搞定。

    并发接口性能设计思路与代码编写 1 引言 2 并发测试定义 3 并发测试分类 4 设计思路整理 5 测试方案设计 6 指标分析 7 代码实战 8 总结 1 引言 这篇是我3月份在公司内部做的技术分享内容 由于我在公司内部分享的内容较多 以及
  • Java 多线程模式 —— Guarded Suspension 模式

    Part1Guarded Suspension 模式的介绍 我们只从字面上看 Guarded Suspension 是受保护暂停的意思 1Guarded Suspension 模式 在实际的并发编程中 Guarded Suspension
  • Java线程(Thread)生命周期的6种状态

    当线程被创建并启动以后 它既不是一启动就进入了执行状态 也不是一直处于执行状态 在线程的生命周期中 可能处于不同的状态 java lang Thread State 列举出了这6种线程状态 线程状态 导致状态发生条件 New 新建 线程刚被

随机推荐

  • CVE-2022-30190复现及原理

    今天各厂商都在发布CVE 2022 30190的安全通告 作为一个与Office有关的RCE漏洞 其原理并不复杂 但利用非常简单无脑甚至不用点击 以后钓鱼肯定要经常用 这里简单复现分析下 环境 Win10 0 16299 32位 Micro
  • OLED透明屏原彩优势和特点解析:开创显示技术新时代

    OLED透明屏 原彩作为一项领先的显示技术 正以其卓越的性能和创新的设计特点引起广泛关注 本文将通过深入探讨OLED透明屏 原彩的优势和特点 应用领域 技术发展以及未来前景等方面内容 并结合具体数据 报告和行业动态 为读者提供专业可信的信息
  • java设置httpheaders_HttpClient 请求添加Header头部信息

    HTTP消息可以包含许多描述消息属性的标头 例如内容长度 内容类型 授权等 HttpClient提供了检索 添加 删除和枚举标头的方法 在下面的教程中 我们将演示如何将自定义HTTP头添加到HttpClient和Http请求方法 Maven
  • 蓬莱小课:统计学中18种数据分析方法汇总

    Part1描述统计 描述统计是通过图表或数学方法 对数据资料进行整理 分析 并对数据的分布状态 数字特征和随机变量之间关系进行估计和描述的方法 描述统计分为集中趋势分析和离中趋势分析和相关分析三大部分 集中趋势分析 集中趋势分析主要靠平均数
  • 【Pytorch】第 5 章 :解决多臂老虎机问题

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 【C++】this指针的理解和__thiscall的调用方式

    我们可以从以下三方面来认识this指针 一 为什么会产生this指针 二 this指针的特点 三 thiscall的调用方式 四 问题 一 为什么会产生this指针 class Box public int volume int heigh
  • es guass 案例

    analyze analyzer standard curl XPOST http 192 168 1 47 9200 searchtube search analyzer ik max word analyzer ik max word
  • 国内常见pip使用镜像源地址

    清华大学镜像源 https pypi tuna tsinghua edu cn simple 阿里云镜像源 http mirrors aliyun com pypi simple 中国科技大学镜像源 https pypi mirrors u
  • vmware 共享文件夹hgfs没有显示

    挂载共享文件夹 当完成共享文件夹之后 会出现在 mnt hgfs目录下 如果没有hgfs文件夹则创建 然后进入虚拟机挂载文件夹 然后执行sudo vmhgfs fuse host mnt hgfs 但是有时候并不显示共享的文件夹 但是如果使
  • c++11之数组array

    c 11数组 定义 注意事项 例子 STL array vector list比较 定义 C 11后 标准库引入了更现代化的数组std array cppreference com是这样介绍的 定义于头文件 template lt clas
  • Windows下如何查看被占用进程及结束进程?

    Windows下如何查看被占用进程及结束进程 查找所有运行的端口命令 netstat ano 查找被占用端口对应的PID netstat aon findstr 2990 查找指定PID的进程 tasklist findstr 1004 结
  • C++学习(十六)有关dump的理解

    1 作为动词 转存的意思 将内容从一个位置转存到另一个位置 2 作为名词 转存文件的意思 某些程序生成的文件 比如操作系统生成的调试日志文件
  • Action 无参数委托详解

    C 委托Action Action
  • opencv实战——机器视觉检测和计数

    引言 在机器视觉中 有时需要对产品进行检测和计数 其难点无非是对于产品的图像分割 由于之前网购的维生素片 有时候忘了今天有没有吃过 就想对瓶子里的药片计数 在学习opencv以后 希望实现对于维生素片分割计数算法 本次实战在基于形态学的基础
  • 跳转关键字

    跳转关键字 break continue break 不能单独存在的 可以用在switch和循环中 表示结束 跳出的意思 代码示例 1 吃1 5号包子 for int i 1 i lt 5 i System out println 在吃第
  • 【C++】深入模板

    文章目录 1 反向迭代器的优化 1 1优化目标 1 2优化 1 3typename的其他使用方式 1 4适合所有容器的打印函数 2 非类型模板参数 3 函数模板特化 4 类模板特化 4 1全特化 4 2偏特化 4 2 1部分模板参数类型特化
  • 在OpenSSL中添加自定义加密算法

    在OpenSSL中添加自定义加密算法 1 加密算法的加载 1 2 密码算法接口的定义 4 3 示例 8 1 加密算法的加载 在调用加密算法之前 通过调用OpenSSL add all algorithms来加载加密算法函数和单向散列算法函数
  • Java中如何捕获其他线程抛出的异常

    如Java中另一个线程抛出的异常 可以使用公共静态接口Thread UncaughtExceptionHandler完成 Thread UncaughtExceptionHandler是当线程因未捕获的异常而突然终止时调用的处理程序接口 当
  • vue JS 对象转数组

    option head title 日期 name date width 180 data date 2021 05 27 name 张三 address 上海市浦东新区XX路XX号 转数组 let option this option l
  • 并发编程系列之线程简介

    前言 前几天我们把Java内存模型介绍了下 大家对JMM也有所认识了 从今天我们就开始走进一个我们天天挂在嘴边 听在耳边的东西 线程 对于线程相信大家都不会陌生 当然也有很多小伙伴在开发中或多或少的使用到线程 即使你没有使用过 但是并不代表