首页 > 其他分享 >线程的四个属性

线程的四个属性

时间:2023-06-03 11:59:23浏览次数:46  
标签:优先级 Id 线程 JVM 四个 id 守护 属性

线程各属性纵览

如上图所示,线程有四个属性:

  • 线程ID
  • 线程名称
  • 守护线程
  • 线程优先级

1. 线程ID

  • 每个线程都有id,这个id不能修改

  • 线程id会不停的自增,从1开始

  • main函数就是第一个线程,id=1

id 是操作系统用来识别各个线程的编号,具有唯一性,从下面 java 的源码中看到,这个线程的Id初始值是0,但是每一次生成Id的时候都是先自增的(++threadSeqNumber),所以起始值实际是1。

测试代码:

/******
 * 线程Id从1开始,JVM运行起来后,自己创建的线程的Id早已不是0
 */
public class Id {
    public static void main(String[] args) {
        Thread thread = new Thread();
        System.out.println("主线程Id:"+Thread.currentThread().getId());
        System.out.println("子线程Id:"+thread.getId());
    }
}

打印结果:

以上看到主线程的id为1,可以理解,那么为什么我们创建的子线程id就直接为12了???

我们打断点调试发现,在我们的子线程创建之前,JVM其实已经为我们创建了许多线程

  • Signal Dispatcher是把操作系统的信号发给我们适当的程序的。
  • Reference Handler是和GC相关的引用线程。
  • Finalizer是负责执行Finalizer对象的方法。

2. 线程名字

(1) 默认线程名的源码分析

  • 有参构造器,指定线程名

  • 无参构造器,默认为Thread- ,后接 nextThreadNum ,这个数字为0开始,自增

(2) 手动设置线程名字 setName()

从上图中 java 的源码可以看到,this.name = name 是修改 java 层面的线程的名字,然后 setNativeName() 是native方法(C/C++层面给线程的名字做一个设置),但当线程启动之后,这个C/C++层面的名字不能修改了;不过 Java 层面的线程名字还是可以修改的。为什么当线程起来之后C/C++层面不能修改,是因为他做了一个!=0(线程的状态)的判断,为0时就是线程 new 出来后还没有 start。

3. 守护线程

线程类型有两种:守护线程、用户线程

守护线程的作用: 给用户线程提供服务。

用户线程和守护线程分类的标准:这个线程是否会阻止 JVM 的退出。当还有用户线程在执行的时候JVM是不会停止的,如果当前只剩下了守护线程,那么守护线程会随着JVM一起停止。

线程类型的特性:

  • 线程类型默认继承自父线程
  • 通常而言,所有的守护线程都是由 JVM 启动。在 JVM 启动的时候有一个非守护线程,那就是main函数。
  • 守护线程不影响 JVM退出,当 JVM 退出的时候,他只看有没有用户线程。

守护线程和用户线程区别

  • 整体上没有区别(只是代码的任务不一样)
  • 唯一区别在于是否影响 JVM 的退出(如果是用户线程会影响JVM的退出,守护线程则不会)

4. 线程优先级

Q:线程的优先级是什么?

A:在操作系统中,线程可以划分优先级,线程优先级越高,获得 CPU 时间片的概率就越大,但线程优先级的高低与线程的执行顺序并没有必然联系,优先级低的线程也有可能比优先级高的线程先执行。

优先级有10个级别,默认5,在Java源码中有三个定义,最低,默认,最高的优先级定义,如下图。

线程虽然有优先级这个设定,但是实际开发中尽量不要设置优先级,即对程序的设计不应该依赖于优先级,主要原因如下:

  • 不同的操作系统优先级不同

    • window中只有7个优先级,java 程序运行在 windows 系统时,会进行优先级映射时,就可能会有多个优先级映射成一个优先级

    • linux中所有线程优先级会被忽略,所有线程优先级一致

  • 优先级可能会被操作系统修改,即优先级高的程序不一定被优先执行

5. 总结

属性总结

文章来源:https://mp.weixin.qq.com/s?__biz=MzU3NDgyMTIxMw==&mid=2247484552&idx=2&sn=9667c58b85d0cc52a30d27beec36087d&chksm=fd2dc2baca5a4bac168dccfd70d55e39db7203b0ef60a53e2e0ff9fd3f8bba7b9558e7d322f7#rd

个人微信:CaiBaoDeCai

微信公众号名称:Java知者

微信公众号 ID: JavaZhiZhe

谢谢关注!

标签:优先级,Id,线程,JVM,四个,id,守护,属性
From: https://www.cnblogs.com/javazhizhe/p/17453738.html

相关文章

  • 多线程的未捕获异常类 UncaughtExceptionHandler 的使用
    一、需要UncaughtExceptionHandler的原因1.主线程可轻松的发现异常,子线程的异常比较隐蔽,难以发现程序运行时,子线程发生了异常,并不影响主线程,也不会终止主线程的程序,主线程将继续执行,这时候子线程的异常可能就不会被察觉,就使得子线程的功能出了问题,但没发现。代码展示:/***......
  • 多线程安全的案例展示与解决方案
    一、概念1.什么是线程安全当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。通俗来说就是:不管业务中遇到怎么的多个线......
  • 多线程-线程池与java内存模型
    多线程-线程池与java内存模型线程池的使用(思路:什么是线程池->他的基本构造以及参数含义->如何使用,使用过程中需要注意什么->有哪些好用的工具类)线程池的基笨概念:首先看一下的继承关系,其次看他的状态,它是利用int的高三位表示状态,比如111表示能接受任务,具体看下面第二章图接下来看......
  • Vue——属性指令、style和class、条件渲染、列表渲染、事件处理、数据双向绑定、过滤
    vm对象<body><divid="app"><h1>{{name}}</h1><button@click="handleClick">点我</button></div></body><script>//1写在data或method中的属性或方法,从vm中直接可以点出来//2method的函数中,如......
  • SpringCloud大文件分片上传/多线程上传
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。这次项目的需求:支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,ie8,ie9,Chrome,Firefox,360安全浏览器,并且刷新浏览器后仍然能够续传,重启浏览器(关闭......
  • 不使用第三方框架编写的多线程断线续传功能
    一、背景最近需要个断线续传功能,但是觉得一些框架不太适合,所以基于原理编写了一个多线程断线续传功能支持技术分享,但是复制和转发我的博客时候请标明出处,谢谢 javascript:void(0)二、断线续传的个人理解:1、断线续传在个人理解,其实就是在出现正常下载流程之外的事情的时候,保存好当......
  • SpringBoot大文件分片上传/多线程上传
    ​ 这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数下面直接贴代码吧,一些难懂的我大部分都加上注释了:上传文件实体类:看得出来,实体类中已经有很多我们需要的功能了,还有实用的属性。如MD5秒传的信息。pub......
  • 判断数组内所有属性均相等
     if( this.data.orderList.every(item=>item.obligationTime===this.data.orderList[0].obligationTime)){        console.log('全等')        this.data.flag=true        clearInterval(this.data.timer)      }else{        co......
  • SpringMVC大文件分片上传/多线程上传
    ​ javaweb上传文件上传文件的jsp中的部分上传文件同样可以使用form表单向后端发请求,也可以使用ajax向后端发请求    1.通过form表单向后端发送请求         <formid="postForm"action="${pageContext.request.contextPath}/UploadServlet"method="post"e......
  • PHP大文件分片上传/多线程上传
    ​ PHP用超级全局变量数组$_FILES来记录文件上传相关信息的。1.file_uploads=on/off 是否允许通过http方式上传文件2.max_execution_time=30 允许脚本最大执行时间,超过这个时间就会报错3.memory_limit=50M 设置脚本可以分配的最大内存量,防止失控脚本占用过多内存,此......