线程基础知识复习

news2025/1/15 23:35:17

线程基础知识复习

并发相关Java包

  • 涉及到的内容
    • java.util.concurrent
    • java.util.concurrent.atomic
    • java.util.concurrent.locks

image-20221119180159948

并发始祖

  • 并发始祖Doug Lea

image-20221119180339148

start线程解读

  • 初始程序
public static void main(String[] args) {
        Thread t1 = new Thread(() ->{
        },"t1");
        t1.start();
    }
//start
    public synchronized void start() {
        /**
         * This method is not invoked for the main method thread or "system"
         * group threads created/set up by the VM. Any new functionality added
         * to this method in the future may have to also be added to the VM.
         *
         * A zero status value corresponds to state "NEW".
         */
        if (threadStatus != 0)
            throw new IllegalThreadStateException();

        /* Notify the group that this thread is about to be started
         * so that it can be added to the group's list of threads
         * and the group's unstarted count can be decremented. */
        group.add(this);

        boolean started = false;
        try {
            //开启线程,start0是一个native方法
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
                /* do nothing. If start0 threw a Throwable then
                  it will be passed up the call stack */
            }
        }
    }

private native void start0();
  • native调用了本地方法,我们可以通过下载官网OpenJDK查看其源码

    • thread.c

      java线程是通过start的方法启动执行的,主要内容在native方法start0中

      Openjdk的写JNI一般是一一对应的,Thread.java对应的就是Thread.c

      start0其实就是JVM_StartThread。此时查看源代码可以看到在jvm.h中找到了声明,jvm.cpp中有实现。

    image-20221119180932794

    • thread.cpp
      • 终于在这里调用了操作系统的线程启动os::start_thread(thread);

image-20221119181140731

Java多线程相关概念

1把锁

2个并(并发和并行)

①并发

是在同一实体上的多个事件,是在同一台处理器上“同时”处理多个任务,同一时刻,其实是只有一个事件在发生。

②并行

是在不同实体上的多个事件,是在多台处理器上同时处理多个任务,同一时刻,大家都真的在做事情,你做你的,我做我的

并发VS并行

image-20221119181313683

3个程(进程 线程 管程)

  • 通过上面start线程的案例,其实进程线程都来源于操作系统。

①进程

系统中运行的一个应用程序就是一个进程,每一个进程都有它自己的内存空间和系统资源。

②线程

也被称为轻量级进程,在同一个进程内基本会有1一个或多个线程,是大多数操作系统进行调度的基本单元。

③管程

Monitor(监视器),也就是我们平时说的锁

Monitor其实是一种同步机制,他的义务是保证(同一时间)只有一个线程可以访问被保护的数据和代码。

JVM中同步是基于进入和退出监视器对象(Monitor,管程对象)来实现的,每个对象实例都会有一个Monitor对象,

Monitor对象会和Java对象一同创建并销毁,它底层是由C++语言来实现的。

进程VS线程

进程是指运行中的程序,一个进程可以拥有多个线程,线程是进程的一个实体,进程和线程的最大不同在于进程基本上是独立的,而线程不一定,线程共享方法区和堆,线程私有栈、本地方法栈和程序计数器。

用户线程和守护线程

Java线程分为用户线程和守护线程

  • 线程的daemon属性为
    • true表示是守护线程
    • false表示是用户线程。

用户线程

是系统的工作线程,它会完成这个程序需要完成的业务操作

守护线程

是一种特殊的线程,为其他线程服务的,在后台默默地完成一些系统性的服务,比如垃圾回收线程。

总结

public class DaemonDemo {
    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + "\t 开始运行, " +
                    (Thread.currentThread().isDaemon() ? "守护线程" : "用户线程"));
            while (true) {

            }
        }, "t1");
        //t1.setDaemon(true);
        t1.start();

        //暂停几秒钟线程
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(Thread.currentThread().getName() + "\t ----end 主线程");
    }
}
  • 两种情况
  1. 未加t1.setDaemon(true);,默认是用户线程,他会继续运行,所以灯亮着;可以看到main方法也是用户线程

    image-20221119193236850

  2. 加了t1.setDaemon(true);将t1设置为守护线程,当用户线程main方法结束后自动退出了

image-20221119193715613

  • 守护线程作为一个服务线程,没有服务对象就没有必要继续运行了,如果用户线程全部结束了,意味着程序需要完成的业务操作已经结束了,系统可退出了。假如当系统只剩下守护线程的时候,java虚拟机会自动退出。

  • setDaemon(true)方法必须在start()之前设置,否则报IIIegalThreadStateException异常

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

涛涛的Linux学习笔记

前言: 因为自己偏向Java后端开发,接触linux有一段时间了,但从来没系统的学过,用啥学啥,所以一直感觉体系不全,现在补补日常能用到的。 一、Linux的定位 二、Linux系统的目录结构 目录结构描述/根目录&#…

【云原生】Docker的初步认识,安装与基本操作

内容预知 1.docker的相关知识 1.1 docker的概念 1.2 docker三个重要概念 (1)image镜像 (2)container容器 (3)repostory仓库 1.3 docker的主要用途 1.4 docker与虚拟机的区别 namesapce&#xff…

STM32F334timer6-7

STM32F334timer6-7概况预分频器描述计数模式时钟概况 基本计时器(TIM6/TIM7)功能包括: •16位自动重新加载递增计数器 •16位可编程预分频器,用于将计数器时钟频率除以1和65535之间的任何因子(也可“动态”&#xff0…

立方体贴图shade计算

正常的平面贴图是根据mesh顶点找到对应的uv坐标,然后根据重心坐标插值计算三角面内每个点的uv坐标值。最后根据uv坐标值查找平面贴图上的颜色值。 立方体贴图的6个面分别为6张图片,我们怎么根据mesh面上的坐标值来计算对应平面上的uv坐标值。 基本算法是…

【算法篇-数论】线性筛法(欧拉筛法)筛 n 以内的质数

筛质数1.线性筛法(欧拉筛法)介绍2.欧拉筛法代码以及分析3.总结本文参考自 B站董晓算法 1.线性筛法(欧拉筛法)介绍 我们的目标是筛出 2 ~ n 以内的质数 最最最暴力的方法就是一个数一个数判断是不是质数 但是这样的时间复杂度是非…

【Java第31期】:Spring中存储Bean的注解以及用法

作者:有只小猪飞走了 博客地址:https://blog.csdn.net/m0_62262008?typeblog 这期内容:揭开Bean存储的神秘面纱 文章目录前言一,Controller(控制存储)二,Service(服务存储&#xff…

过拟合问题(机器学习)

训练误差代表分类方法对于现有训练样本集的拟合程度 泛化误差代表此方法的泛化能力,即对于新的样本数据的分类能力如何 模型的训练误差比较高,则称此分类模型欠拟合 模型的训练误差低但是泛化误差比较高,则称此分类模型过拟合 对于欠拟合…

QGIS制作精美地图

QGIS制作精美地图 1.首先新建一个Print Layout,并为其命名(PS:如果创建完不小心删了,点右面的Layout Manager即可~ 2.在右侧空白处,设置页面大小(也可以在空白页面右键——属性) 3.点击Items——Add Map,然后在空白页面框画一个范围,这与ArcGIS pro的操作类似(PS:如…

【UML】类图Class Diagram

1、面向对象 面向对象分析:OOA(Object-Oriented Analysis) 面向对象设计:OOD(Object-Oriented design) 面向对象分析和面向对象设计的核心问题是怎么抽象对象。类图就是用来表示对象,可以表示…

JavaScript 基础1:变量与数据类型及其转换

JavaScript 基础1:变量与数据类型及其转换 Date: September 17, 2022 了解变量、数据类型、运算符等基础概念,能够实现数据类型的转换,结合四则运算体会如何编程。 体会现实世界中的事物与计算机的关系理解什么是数据并知道数据的分类理解变…

Path.Combine的坑

最近在写一个自动生成代码到指定文件夹的代码需要让玩家指定文件夹紧接着就遇到问题了 可以看到两个路径并没有合并。我查了一下,原来问题是出在总之就是有很多坑。不要用

【USB】macOS usb内核驱动开发入门

文章目录一、环境准备1、背景说明2、SIP是什么?为啥要关闭SI?P3、关闭SIP(intel处理器)4、样例代码下载二、编译运行三、参考资料一、环境准备 不想我啰哩啰嗦的直接跳到第3点开始执行!!! 1、…

维格云轮播组件入门教程

功能简介 维格云轮播组件是对内传达核心价值观、重要通知,对外宣传广告、推广信息的工具。 维格云轮播组件借助在图片中镶嵌链接,并将多张图片循环播放的方式,可让企业的信息更加突出、有效、快捷地传达。 设置步骤 功能入口 【选择任意应用】——【编辑门户】——【轮播…

基于Kubernetes与云原生的存储测试基准CNSBench

CNSBench A Cloud Native Storage Benchmark基础知识CNSBench的摘要与介绍Kubernetes BackgroundKubernetes的工作流程CNSBench提出的需求分析CNSBench设计与实现CNSBench的示意图CNSBench的基准自定义资源基准自定义资源定义基准自定义资源实例基准测试控制器性能测试与实验测…

gcc编译选项

gcc编译步骤 有下面一个源程序 main.c: #include "stdio.h"int main(void) {printf("Hello World !");return 0; }在使用gcc 将 源文件 main.c编译成 可执行目标程序 总共需要4步: 1、源文件 main.c 预处理后,生成mai…

OpenCV-Python小应用(四):红绿灯检测

OpenCV-Python小应用(四):红绿灯检测前言前提条件实验环境红绿灯检测参考文献前言 本文是个人使用OpenCV-Python的应用案例,由于水平有限,难免出现错漏,敬请批评改正。更多精彩内容,可点击进入 …

血氧仪方案组成结构设计分析

任何产品都需要外部结构作为载体,将产品使用化的,血氧仪一样。 在血氧仪方案开发中,我们发现,血氧仪仅仅做好电子功能设计,其实根本就不够,没有好的结构件配合,其实要实现功能,那是天…

Nginx入门笔记

目录 Nginx 快速入门 1. 启动,停止和重新加载 Nginx 配置 2. 配置文件的结构 3. 提供静态内容服务(静态网站) 4. 设置简单的代理服务器 5. 设置 FastCGI 代理 Nginx 进程和运行时控制 1. 主进程和工作进程 2. 控制 Nginx Nginx 配置文件 Nginx 配置 Web 服…

Jenkins 构建maven项目时提示:No compiler is provided in this environment.

在确保虚拟机中的maven已经安装且可以正常执行mvn install 的情况下,Jenkins构建时执行maven编译仍然提示 No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 首先请确保你的虚拟机上安装了JDK以及Maven&#…

MPU进化,多核异构处理器有多强?A核与M核通信过程解析

内容来源:www.forlinx.com随着市场对嵌入式设备功能需求的提高,市面上出现了集成嵌入式处理器和单片机的主控方案,以兼顾性能和效率。 在实际应用中,嵌入式处理器和单片机之间需要进行大量且频繁的数据交换,如果采用低…