目录:

  • 常见属性
  • 构造函数
  • start()
  • run()

常见属性:

   /**
* 线程名称
*/
private volatile String name; /**
* 线程优先级
*/
private int priority; /**
* 是否为守护线程,true-是守护线程
*/
private boolean daemon = false; /**
* 可能被执行的Runnable
*/
private Runnable target; /**
* 所属线程组
*/
private ThreadGroup group; /**
* 当前线程所属的ThreadLocal
*/
ThreadLocal.ThreadLocalMap threadLocals = null; /**
* 为子线程提供父线程所继承的值
*/
ThreadLocal.ThreadLocalMap inheritableThreadLocals = null; /**
* 当前线程的栈大小,若不指定默认为0;如何使用这个数值取决于JVM
*/
private long stackSize; /**
* 线程的id
*/
private long tid; /**
* 线程序列号
*/
private static long threadSeqNumber; /**
* 线程状态,默认是未启动
*/
private volatile int threadStatus = 0; /**
* 得到下一个线程的序列号
*/
private static synchronized long nextThreadID() {
return ++threadSeqNumber;
} /**
* 为java.util.concurrent.locks.LockSupport.park提供的变量
*/
volatile Object parkBlocker; /**
* 阻塞器锁,主要处理阻塞状况
*/
private volatile Interruptible blocker; /**
* 阻断锁
*/
private final Object blockerLock = new Object(); /**
* 最低优先级
*/
public final static int MIN_PRIORITY = 1; /**
* 默认优先级
*/
public final static int NORM_PRIORITY = 5; /**
* 最高优先级
*/
public final static int MAX_PRIORITY = 10;

构造器:

我们看源码可以看出,所有的构造函数都是调用init()方法;所以我们来说说init()方法

 private void init(ThreadGroup g, Runnable target, String name, long stackSize, AccessControlContext acc, boolean inheritThreadLocals) {
// 线程名不能为空
if (name == null) {
throw new NullPointerException("name cannot be null");
}
this.name = name; // 当前创建的线程的父线程为正在运行的线程
Thread parent = currentThread(); // -------------- 安全校验 start ----------------
SecurityManager security = System.getSecurityManager();
if (g == null) {
if (security != null) {
g = security.getThreadGroup();
} if (g == null) {
g = parent.getThreadGroup();
}
} g.checkAccess(); if (security != null) {
if (isCCLOverridden(getClass())) {
security.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);
}
}
// -------------- 安全校验 end ---------------- // 记录一下未启动线程的个数
g.addUnstarted(); this.group = g;
// 从这便可以得知为什么父线程是守护线程子线程也是守护线程
this.daemon = parent.isDaemon();
// 从这便可以得知为什么子线程的优先级是继承父线程的
this.priority = parent.getPriority(); if (security == null || isCCLOverridden(parent.getClass())) {
this.contextClassLoader = parent.getContextClassLoader();
} else {
this.contextClassLoader = parent.contextClassLoader;
} this.inheritedAccessControlContext = acc != null ? acc : AccessController.getContext();
// 设置线程的执行体
this.target = target;
// 设置线程优先级
setPriority(priority); if (inheritThreadLocals && parent.inheritableThreadLocals != null) {
// 为子线程提供从父线程那继承的值
this.inheritableThreadLocals = ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);
} this.stackSize = stackSize;
// 设置线程ID
tid = nextThreadID();
}

start():

 public synchronized void start() {
// 只能启动状态为未启动的线程
if (threadStatus != 0) {
throw new IllegalThreadStateException();
} // 将当前线程添加到线程组中
group.add(this); boolean started = false;
try {
// 将线程置为就绪状态,此函数为JVM层次的
start0();
started = true;
} finally {
try {
// 启动失败后未启动线程数+1
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) { }
}
}
 private native void start0();

run():

 /**
* 线程具体的执行逻辑
*/
@Override
public void run() {
// 若有指定执行的Runnable,跑Runnable的具体逻辑
if (target != null) {
target.run();
}
}

并发编程学习笔记(七、Thread源码分析)的更多相关文章

  1. memcached学习笔记——存储命令源码分析下篇

    上一篇回顾:<memcached学习笔记——存储命令源码分析上篇>通过分析memcached的存储命令源码的过程,了解了memcached如何解析文本命令和mencached的内存管理机制 ...

  2. memcached学习笔记——存储命令源码分析上篇

    原创文章,转载请标明,谢谢. 上一篇分析过memcached的连接模型,了解memcached是如何高效处理客户端连接,这一篇分析memcached源码中的process_update_command ...

  3. 并发编程(四)—— ThreadLocal源码分析及内存泄露预防

    今天我们一起探讨下ThreadLocal的实现原理和源码分析.首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两 ...

  4. 【Java并发编程】16、ReentrantReadWriteLock源码分析

    一.前言 在分析了锁框架的其他类之后,下面进入锁框架中最后一个类ReentrantReadWriteLock的分析,它表示可重入读写锁,ReentrantReadWriteLock中包含了两种锁,读锁 ...

  5. tornado 学习笔记6 Application 源码分析

    Application 是Tornado重要的模块之一,主要是配置访问路由表及其他应用参数的设置. 源代码位于虚拟运行环境文件夹下(我的是env),具体位置为env > lib>sit-p ...

  6. 【Java并发编程】19、DelayQueue源码分析

    DelayQueue,带有延迟元素的线程安全队列,当非阻塞从队列中获取元素时,返回最早达到延迟时间的元素,或空(没有元素达到延迟时间).DelayQueue的泛型参数需要实现Delayed接口,Del ...

  7. java并发编程基础-ReentrantLock及LinkedBlockingQueue源码分析

    ReentrantLock是一个较为常用的锁对象.在上次分析的uil开源项目中也多次被用到,下面谈谈其概念和基本使用. 概念 一个可重入的互斥锁定 Lock,它具有与使用 synchronized 相 ...

  8. 多线程高并发编程(4) -- ReentrantReadWriteLock读写锁源码分析

    背景: ReentrantReadWriteLock把锁进行了细化,分为了写锁和读锁,即独占锁和共享锁.独占锁即当前所有线程只有一个可以成功获取到锁对资源进行修改操作,共享锁是可以一起对资源信息进行查 ...

  9. 多线程高并发编程(5) -- CountDownLatch、CyclicBarrier源码分析

    一.CountDownLatch 1.概念 public CountDownLatch(int count) {//初始化 if (count < 0) throw new IllegalArg ...

  10. 多线程高并发编程(6) -- Semaphere、Exchanger源码分析

    一.Semaphere 1.概念 一个计数信号量.在概念上,信号量维持一组许可证.如果有必要,每个acquire()都会阻塞,直到许可证可用,然后才能使用它.每个release()添加许可证,潜在地释 ...

随机推荐

  1. FreeRTOS临界保护

    下面的是个人笔记,所有的话都适用于我本人理解,可能存在不对的地方. 进入临界保护(支持嵌套):taskENTER_CRITICAL(); 退出临界保护(支持嵌套):taskEXIT_CRITICAL( ...

  2. 【攻防世界】高手进阶 pwn200 WP

    题目链接 PWN200 题目和JarvisOJ level4很像 检查保护 利用checksec --file pwn200可以看到开启了NX防护 静态反编译结构 Main函数反编译结果如下 int ...

  3. 房屋布局分析《Physics Inspired Optimization on Semantic Transfer Features: An Alternative Method for Room Layout Estimation》

    视觉算法在智能审核系统上的演进与实践 刘天悦 贝壳找房 / 资深工程师 https://static001.geekbang.org/con/56/pdf/1088777747/file/%E8%A7 ...

  4. matlab练习程序(点云密度)

    算法思路是首先建立kd树,然后找到每个点距离最近的点的距离,对距离求和再求平均即可. 代码如下: clear all; close all; clc; pc = pcread('rabbit.pcd' ...

  5. Xml之Schema XSD约束{详细}

    问题: 学习Schema其他标签的定义 约束 引入的方式: 基本格式: 1构建schema: 1.1 最基本的单位元素 1.2 元素属性 1.3 simpleType 定义类型 1.4 复合结构类型 ...

  6. vue实现页面跳转(简易版)

    1.用点击函数 <button class="btntop" @click="gootherpage">跳转页面</button> 函数 ...

  7. keras EfficientNet介绍,在ImageNet任务上涨点明显 | keras efficientnet introduction

    本文首发于个人博客https://kezunlin.me/post/88fbc049/,欢迎阅读最新内容! keras efficientnet introduction Guide About Ef ...

  8. 【linux】linux命令--uptime查看机器存活多久和平均负载 解读平均负载含义

    一.uptime命令,查看机器存活时间和平均负载 键入命令: uptime 该结果和 top命令查看结果最上面一行的 是一样的显示. 返回数据介绍: #当前服务器时间: 19:56:44 #当前服务器 ...

  9. ASP.NET(1)

    1.IIS安装问题,先装VS再装IIS,处理程序映射有问题,使用VS自带的控制台输入命令,注册路径 2.开发模式,一般处理程序,使用IO操作读取html文件,使前后端分离 3.post请求和get请求 ...

  10. Z从壹开始前后端分离【 .NET Core2.2/3.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探

    本文梯子 本文3.0版本文章 更新 代码已上传Github+Gitee,文末有地址 零.今天完成的绿色部分 一.依赖注入的理解和思考 二.常见的IoC框架有哪些 1.Autofac+原生 2.三种注入 ...