2 线程基础知识复习

news2024/11/26 18:34:28

1、并发相关Java包

  • 涉及到的包内容

    • java.util.concurrent

    • java.util.concurrent.atomic

    • java.util.concurrent.locks

在这里插入图片描述

2、并发始祖

在这里插入图片描述

3、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();
            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();//start0是一个native方法

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

    • thread.c

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

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

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

    • jvm.cpp
      在这里插入图片描述
    • thread.cpp
      • 终于在这里调用了操作系统的线程启动,os::start_thread(thread);

    在这里插入图片描述

3、Java多线程相关概念

1、1把锁

2、2个并(并发和并行)

①并发

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

②并行

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

并发VS并行

在这里插入图片描述

3、3个程(进程 线程 管程)

  • 3个程(进程 线程 管程)

①进程

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

②线程

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

③管程

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

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

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

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

进程VS线程

进程是…,线程是…,进程和线程的最大不同在于进程基本上是独立的,而线程不一定,线程共享方法区和堆,线程私有栈、本地方法栈和程序计数器

4、用户线程和守护线程

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");
    //线程的daemon属性为true表示是守护线程,false表示是用户线程
    //---------------------------------------------
    t1.setDaemon(true);
    //-----------------------------------------------
    t1.start();
    //3秒钟后主线程再运行
    try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }

    System.out.println("----------main线程运行完毕");
}

}

  • 两种情况

1、未加t1.setDaemon(true);,默认是用户线程,他会继续运行,所以灯亮着

2、加了t1.setDaemon(true);是守护线程,当用户线程main方法结束后自动退出了
在这里插入图片描述

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

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

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

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

相关文章

从功能测试到自动化测试,待遇翻倍,我整理的超全学习指南!

在这个吃技术的IT行业来说,我刚入行的时候每天做的也是最基础的工作,但是随着时间的消磨,我产生了对自我和岗位价值和意义的困惑。一是感觉自己在浪费时间,另一个就是做了快2年的测试,感觉每天过得浑浑噩噩&#xff0c…

一个JVM参数,服务超时率降了四分之三

先说结论:通过优化Xms,改为和Xmx一致,使系统的超时率降了四分之三 1. 背景 一个同事说他负责的服务在一次上线之后超时率增加了一倍 2. 分析 2.1 机器的监控 首先找了一台机器,看了监控 上线后最明显的变化就是CPU使用率变高了…

Redis6之主从复制

主从复制 是指将一台Redis服务器的数据,复制到其他Redis服务器。前者称为主节点,后者称为从节点;数据复制是单向的,只能由主节点复制到从节点;主节点以写为主,从节点以读为主。 特点 1.使用异步复制&#…

VS2019 QT5 第一个项目

(1条消息) VS2017PyQt5环境配置以及第一个HellowPyQt5_vs pyqt_2011老王的博客-CSDN博客 利用工具里的PyUIC5,将ui转为py 选中刚加入的ui文件,工具》PyUIC5 利用工具里的PyUIC5,将ui转为py 选中刚加入的ui文件,工具》PyUIC5 利用…

用Python手动实现一个简单的服务器,不借助任何框架在浏览器中输出任意内容

目录标题 前言主要内容开始我们的代码,先是导入模块为浏览器发送数据的函数创建一个执行函数网站服务启动程序运行代码尾语 前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 在公司网站开发中,我们往往借助于Flask、Django等网站开发框架去提高网站开…

libevent实践03:监听有名管道

首先创建两个管道:p1,p2 lkmaoubuntu:/big/libevent/libevent-2.1.12-stable/_install/learn$ mkfifo p1 p2 lkmaoubuntu:/big/libevent/libevent-2.1.12-stable/_install/learn$ ls -lshF p1 p2 0 prw-rw-r-- 1 lkmao lkmao 0 6月 29 20:39 p1| 0 prw-rw-r-- 1 l…

Blender导出gltf格式ThreeJS不显示问题-

1. 检查代码 import { GLTFLoader } from three/addons/loaders/GLTFLoader.js; 。。。。。。initRoomGltf() {const _this this;// const loader new OBJLoader();const loader new GLTFLoader();// load a resourceloader.load(// resource URL// this.commonFunc.getPat…

【2023年江西省研究生数学建模竞赛】题目三 植物的多样性 建模方案及参考文献

代码与结果如下:完整文档见文末 相关思路请点击这里到原文章查看 2023年江西省研究生数模竞赛题目三:植物的多样性 植物作为食物链中的生产者,通过光合作用吸收二氧化碳,制造氧气,同时为其他生物提供食物和栖息地&a…

(一)创建线程的三种方式

(一)创建线程的三种方式 1.1 线程与进程1.2 创建线程的三种方式01、继承Thread类02、实现Runnable接口03、实现Callable接口 1.3 Question?01、为什么要重写 run() 方法?02、run() 方法和 start() 方法有什么区别?03、…

npm 包 - serve 使用

前端打包后,或者本地的html文件。有时需要将打包好的项目跑一下看看效果,这时就可以使用 serve 工具,在本地启动一个静态文件服务器。本文主要简单记录下 npm 包 serve 的基本使用命令。 一、全局安装 serve npm install serve -g二、运行 s…

php宝塔搭建部署活动现场大屏幕互动系统php源码

大家好啊,我是测评君,欢迎来到web测评。本期给大家带来一套活动现场大屏幕互动系统php源码。抽时间看了一下,功能还是不错的,有参考价值。感兴趣的朋友可以自行下载学习。 技术架构 PHP7.0 nginx mysql5.7 JS CSS HTMLcneto…

【Java】Java核心 82:Git 教程(5)修改撤销

文章目录 08.GIT本地操作-修改撤消目标内容小结 09.GIT本地操作-总结 在Git中,可以使用不同的操作来修改和撤销提交。以下是几种常用的方法: 修改最后一次提交:如果你需要修改最后一次提交的提交信息或者漏掉了某些文件,可以使用…

Linux进程信号【信号保存】

✨个人主页: 北 海 🎉所属专栏: Linux学习之旅 🎃操作环境: CentOS 7.6 阿里云远程服务器 文章目录 🌇前言🏙️正文1、再次认识信号1.1、概念1.2、感性理解1.3、在内核中的表示1.4、sigset_t 信…

安装完MySQL后/var/log/mysqld.log中找不到初始密码

背景:我安装完MySQL后,密码忘记了,然后我又重新装了一次,结果发现重新安装后,/var/log/mysqld.log中找不到初始密码 找初始密码的命令 grep temporary password /var/log/mysqld.log问题原因:再删除MySQL…

matplotlib 更改离散colorbar分界线的宽度和外边框的宽度

1 设置colorbar颜色间隔线的宽度 通过属性dividers设置colorbar颜色间隔线的宽度 # 将drawedges设置为True,从而显示颜色之间的分界线 cbar fig.colorbar(im, axaxs, orientationhorizontal, ticksbins, drawedgesTrue) # 利用属性dividers设置宽度 cbar.divider…

小马识途:全媒体营销是未来营销之道

全媒体营销和整合营销都是广泛应用于市场营销领域的策略,但两者之间还是有一些区别和相似之处的。 全媒体营销和整合营销的相同之处,小马识途营销顾问认为两者都是多渠道整合的营销方式,都强调利用多个渠道和媒体来传播信息,以达到…

循环控制基础

循环控制 Key Point ●for 循环的使用 ●while 循环 ●do...while 循环 ●break 和continue 练习 1. (for 循环)计算123...100 的和 public class Test21 { public static void main(String[] args) { // (for 循环)计算…

我该如何抉择?测试工程师vs测试开发工程师vs开发工程师...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 软件开发工程师&a…

基于Python所写的读者书库设计

点击以下链接获取源码资源: https://download.csdn.net/download/qq_64505944/87964232 《RCQ读者书库》程序使用说明 在PyCharm中运行《RCQ读者书库》即可进入如图1所示的系统主界面。 图1 系统主界面 具体的操作步骤如下: (1)…

智慧校园--webGIS--高德地图

实现地图点击打卡&#xff0c;驾车路线。 需要自己去高德开发平台注册新建自己的项目保存key和秘钥 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"…