Java.lang.Thread是Java应用程序员对Java多线程的第一站,Thread就是对Java线程本身的抽象
所以在Java中的线程编程概念中,一个Thread实例 == 一个线程
线程有哪些属性、行为,Thread大致就有哪些属性、行为。
 
前文中有说到,Java线程通过Thread以及synchronized以及Object中的wait等对“控制、同步、通信”进行了抽象,synchronized关键字是同步,Object中的相关方法是通信,Thread中的信息主要是控制以及自身的行为,但是比如join方法,也可以被认为是用于“通信”,所以不要一概而论,也不要咬文嚼字,要注重背后的思维

Thred概述

线程也是对程序运行的抽象描述,所以线程包括两部分信息:
  • 一个是线程自身数据(元数据)
  • 另一个是将要执行的任务
自身数据又分为必备的控制信息以及行为。
也就是说一个Thread包括了三方面的信息:基本信息、线程自身的行为、线程任务
 

基本信息

如下图所示,基本信息包括下面这些
  • 名称、id、优先级、状态、线程组、守护线程状态、堆栈信息跟踪
  • 上下文类加载器设置、异常处理器设置
  • 是否存活、当前线程是否有权修改该线程

名称

线程是有名称的,有属性name,如果不指定名称,那么会生成thread-0,thread-1..........thread-N这种名称
  

ID

如果类比到人的话,名称就是姓名,而ID就是身份证号,线程也有一个唯一的标识符
线程 ID 是一个正的 long 数,在创建该线程时生成,线程 ID 是唯一的,并终生不变
线程终止时,该线程 ID 可以被重新使用
在私有方法init方法中设置
  

优先级  

线程内部priority记录优先级
如果设置的值不在有效范围内,直接抛出异常
否则线程的优先级会被设置为“指定的 newPriority 和 该线程的线程组允许的最大优先级”两者中较小的那一个。
简单说就是不能超过线程组的最大优先级,你工资再高也超不过你领导......
线程默认的优先级是NORM_PRIORITY=5,一般情况下不需要设置优先级
因为你设置了优先级并不一定总是完全按照你的想法进行,前面说过,Java线程是操作系统原生线程的映射,要依赖操作系统
所以,万万不要业务逻辑依赖你自以为的线程优先级
  

状态

类似进程,线程也是有专门的状态的
有内部类State

线程组

线程组用于对线程进行管理,ThreadGroup
线程组表示一个线程的集合。此外,线程组也可以包含其他线程组
线程组构成一棵树,在树中,除了初始线程组外,每个线程组都有一个父线程组  

守护线程状态

可以将一个Thread标记为守护线程
守护线程,可以认为是后台线程
如果没有任何一个非守护线程在运行,或者说在运行的线程都是守护线程,JVM将退出。
全都是服务员,一个客人都没有,那还忙活个屁?
需要注意的是,必须是线程启动前设置,不然你试试看,分分钟  throw new IllegalThreadStateException();
因为已启动尚未终止的就是isAlive==true
  

堆栈信息跟踪

简单的可以理解为线程运行时有一个“调用栈信息”,后续介绍  

上下文类加载器设置

除非特别设置,否则contextClassLoader将会设置为与父线程同样的值。
上线文类加载器是类加载机制的后门,打破了双亲委派模型,此处不对上下文类加载器进行介绍,也是一个比较重要的知识点。  

异常处理器设置

线程在执行单元中是不允许抛出checked异常的,而且线程运行在自己的上下文中,派生它的线程将无法直接获得它运行中出现的异常信息。
所以Java为我们提供异常处理器回调机制,异常处理器的设置就是这个作用   

是否存活

线程从启动之后,直到最终终止,这一个过程被称之为是活动状态
换句话说,一个线程start之后,除非他被终止,否则任何时刻都是true
isAlive就是用于检测线程是否处于活动状态  

当前线程是否有权修改该线程

判定当前运行的线程是否有权修改该线程。
比如线程Thread aThread,在main方法中调用aThread.checkAccess,此时当前线程是主线程main,目标是aThread
那么就是检测主线程是否有权利修改线程aThread

线程行为

Thread中的方法,有一些是线程本身的行为控制或者通信,另外还有一些相当于是工具类
还有一些被弃用了

currentThread

返回对当前正在执行的线程对象的引用,线程是Thread,哪个Thread正在运行,那么就返回哪个对象就好了,返回类型就是Thread

activeCount

返回的是当前线程,所在的线程组中,活动线程的个数

enumerate

线程的抽象是Thread,每一个线程都是一个Thread,既然是对象那么就有类似寻常对象的操作,比如保存到数组
enumerate就是用来讲当前线程的、所属线程组中的、以及子组中的每一个活动线程复制到指定的数组中,返回值为复制的线程的个数
依赖于线程组中的相关方法
 

是否持有指定监视器的锁

如同前面提到过的互斥量,Java中同步时需要用到一个对象锁,如果一个线程请求的锁被别的线程获得,那么就需要进行等待,持有了锁就可以进入临界区。
方法用于判断当前线程,当前线程、当前线程。针对于某个对象,是否持有对应的锁,当且仅当当前线程在指定的对象上保持监视器锁时,才返回 true。
如果 obj 为 null,抛出NPE    

dumpStack

用于调试,将当前线程的信息打印到标准错误流

线程任务

线程的任务核心是Runnable,内部持有一个Runnable target,构造时如果不进行设置那么为null
调用start方法启动后,会调用run方法,如果不重写run方法,或者构造时不进程传递,那么target为null
很显然如果target,run方法就相当于一个空方法,也就是什么都不做。
简言之,Java对于线程以及线程任务,进行了抽象分离,对线程的抽象为Thread,而对于线程任务的抽象就是Runnable。

总结

Thread是Java对线程的抽象,所以他的属性信息自然与线程的概念是不谋而合和,本文对Thread中定义的一些属性进行了简单介绍,有些后续还会详细进行介绍
Thread中的方法主要用于对线程进行控制也可以用作通信,还有一些是基于类设计层面的,添加进来的一些工具类,可以对线程的一些信息进行控制、获取
线程任务是通过Runnable进行抽象,简言之,Thread表示线程,Runnable表示任务。
“分别是为了更好地重逢”放到这里非常合适,解耦是为了更好地协作。
线程本身和线程需要执行的任务进行分离,无论是从抽象概念上还是认知理解上,亦或者是二者独立的发展上,解耦都有多种好处
彻底认清楚Thread的本质--线程概念的抽象,才能够更好的了解Thread中那些属性字段
比如你完全不了解IEEE754,何谈对Float的实现熟悉?概念都不清晰,哪来的清晰地实现?
Thread是对线程的抽象,封装了线程具有的一些属性和状态以及行为信息,具体就是体现在内部的字段和方法上,另外还有一些相当于工具类的存在的方法,也是构建在Thread中的,所以线程是Thread,Thread是线程概念的体现。
不管JVM内部如何映射,操作系统如何构建线程模型,Java开发者接触的就是Thread的实例对象。
在Java这一面向对象的语言中,多线程编程就是“多Thread对象编程”
我们常说Java是纯粹的面向对象的编程语言,什么“封装、继承、多态”等等的,但是真的理解了面向对象的思维了么?这就是面向对象!万事万物都是对象
 

Thread类详解 多线程中篇(二)的更多相关文章

  1. Java线程创建形式 Thread构造详解 多线程中篇(五)

    Thread作为线程的抽象,Thread的实例用于描述线程,对线程的操纵,就是对Thread实例对象的管理与控制. 创建一个线程这个问题,也就转换为如何构造一个正确的Thread对象. 构造方法列表 ...

  2. InheritableThreadLocal类原理简介使用 父子线程传递数据详解 多线程中篇(十八)

      上一篇文章中对ThreadLocal进行了详尽的介绍,另外还有一个类: InheritableThreadLocal 他是ThreadLocal的子类,那么这个类又有什么作用呢?   测试代码 p ...

  3. 线程组ThreadGroup分析详解 多线程中篇(三)

    线程组,顾名思义,就是线程的组,逻辑类似项目组,用于管理项目成员,线程组就是用来管理线程. 每个线程都会有一个线程组,如果没有设置将会有些默认的初始化设置 而在java中线程组则是使用类ThreadG ...

  4. Java基础-进程与线程之Thread类详解

    Java基础-进程与线程之Thread类详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.进程与线程的区别 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 ...

  5. java.lang.Thread类详解

    java.lang.Thread类详解 一.前言 位于java.lang包下的Thread类是非常重要的线程类,它实现了Runnable接口,今天我们来学习一下Thread类,在学习Thread类之前 ...

  6. thread 类详解

    java.lang.Thread类详解 一.前言 位于java.lang包下的Thread类是非常重要的线程类,它实现了Runnable接口,今天我们来学习一下Thread类,在学习Thread类之前 ...

  7. C#中的多线程使用 -- Thread 类详解(转)

    现在C#已经建议摈弃使用 Suspend, Resume 暂停/恢复线程, 也尽量少用 Abort方法中断一个线程. 建议使用线程的同步手段有: Mutex.ManualResetEvent.Auto ...

  8. 并发编程(四)Thread类详解

    一.引言 Thread类中存在着许多操作线程的方法,学习Thread类是非常有必要的,前面我们也嘘唏了创建线程的几种方式,若线程的创建不是以继承Thread类的方式创建的,那我们又改如何使用Threa ...

  9. Java知多少(58)线程Runnable接口和Thread类详解

    大多数情况,通过实例化一个Thread对象来创建一个线程.Java定义了两种方式: 实现Runnable 接口: 可以继承Thread类. 下面的两小节依次介绍了每一种方式. 实现Runnable接口 ...

随机推荐

  1. Hibernate 检索方式之 HQL 检索方式

    HQL(Hibernate Query Language) 是面向对象的查询语言,它和 SQL 查询语言有些相似.在 Hibernate 提供的各种检索方式中,HQL 是使用最广的一种检索方式,它有如 ...

  2. CSS-默认padding 和 margin

    一.h1~h6标签:有默认margin(top,bottom且相同)值,没有默认padding值. 在chrome中:16,15,14,16,17,19; 在firefox中:16,15,14,16, ...

  3. 【react】---手动封装一个简易版的redux

    export let createStore = (reducer)=>{ //定义默认的state let state; //定义默认的action let actionTypes = &qu ...

  4. 吴恩达机器学习笔记56-多元高斯分布及其在误差检测中的应用(Multivariate Gaussian Distribution & Anomaly Detection using the Multivariate Gaussian Distribution)

    一.多元高斯分布简介 假使我们有两个相关的特征,而且这两个特征的值域范围比较宽,这种情况下,一般的高斯分布模型可能不能很好地识别异常数据.其原因在于,一般的高斯分布模型尝试的是去同时抓住两个特征的偏差 ...

  5. 怎么使用zepto.js的tap事件引起的探索

    前言:   在使用zepto.js之前,你首先要知道它是什么?为什么要使用它?以及它和jquery有什么区别? ①:简单来说zepto是一个轻量级的针对现代高级浏览器的JavaScript库, 它与j ...

  6. [Swift]LeetCode60. 第k个排列 | Permutation Sequence

    The set [1,2,3,...,n] contains a total of n! unique permutations. By listing and labeling all of the ...

  7. [Swift]LeetCode232. 用栈实现队列 | Implement Queue using Stacks

    Implement the following operations of a queue using stacks. push(x) -- Push element x to the back of ...

  8. [Swift]LeetCode662. 二叉树最大宽度 | Maximum Width of Binary Tree

    Given a binary tree, write a function to get the maximum width of the given tree. The width of a tre ...

  9. H5与企业微信jssdk集成

    H5与企业微信jssdk集成 一.公众号设置 注册企业微信,在应用与小程序栏目中,设置可信域名,配置公众号菜单.可信域名不得不说下,在最初开发时,认为设置并验证后,微信认证接口会实现跨域请求,其实并没 ...

  10. Python数据挖掘(爬虫强化)

    (我喜欢雨天,因为雨天我可以回到童年踩水花!哈!) 2018年 --7月--12日 : 多云又暴雨 T—T 前言 我要把爬虫的终极利器介绍一下,这个只要是我们肉眼能看到的,就算在源码中或者在json中 ...