并发编程学习笔记(七、Thread源码分析)
目录:
- 常见属性
- 构造函数
- 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源码分析)的更多相关文章
- memcached学习笔记——存储命令源码分析下篇
上一篇回顾:<memcached学习笔记——存储命令源码分析上篇>通过分析memcached的存储命令源码的过程,了解了memcached如何解析文本命令和mencached的内存管理机制 ...
- memcached学习笔记——存储命令源码分析上篇
原创文章,转载请标明,谢谢. 上一篇分析过memcached的连接模型,了解memcached是如何高效处理客户端连接,这一篇分析memcached源码中的process_update_command ...
- 并发编程(四)—— ThreadLocal源码分析及内存泄露预防
今天我们一起探讨下ThreadLocal的实现原理和源码分析.首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两 ...
- 【Java并发编程】16、ReentrantReadWriteLock源码分析
一.前言 在分析了锁框架的其他类之后,下面进入锁框架中最后一个类ReentrantReadWriteLock的分析,它表示可重入读写锁,ReentrantReadWriteLock中包含了两种锁,读锁 ...
- tornado 学习笔记6 Application 源码分析
Application 是Tornado重要的模块之一,主要是配置访问路由表及其他应用参数的设置. 源代码位于虚拟运行环境文件夹下(我的是env),具体位置为env > lib>sit-p ...
- 【Java并发编程】19、DelayQueue源码分析
DelayQueue,带有延迟元素的线程安全队列,当非阻塞从队列中获取元素时,返回最早达到延迟时间的元素,或空(没有元素达到延迟时间).DelayQueue的泛型参数需要实现Delayed接口,Del ...
- java并发编程基础-ReentrantLock及LinkedBlockingQueue源码分析
ReentrantLock是一个较为常用的锁对象.在上次分析的uil开源项目中也多次被用到,下面谈谈其概念和基本使用. 概念 一个可重入的互斥锁定 Lock,它具有与使用 synchronized 相 ...
- 多线程高并发编程(4) -- ReentrantReadWriteLock读写锁源码分析
背景: ReentrantReadWriteLock把锁进行了细化,分为了写锁和读锁,即独占锁和共享锁.独占锁即当前所有线程只有一个可以成功获取到锁对资源进行修改操作,共享锁是可以一起对资源信息进行查 ...
- 多线程高并发编程(5) -- CountDownLatch、CyclicBarrier源码分析
一.CountDownLatch 1.概念 public CountDownLatch(int count) {//初始化 if (count < 0) throw new IllegalArg ...
- 多线程高并发编程(6) -- Semaphere、Exchanger源码分析
一.Semaphere 1.概念 一个计数信号量.在概念上,信号量维持一组许可证.如果有必要,每个acquire()都会阻塞,直到许可证可用,然后才能使用它.每个release()添加许可证,潜在地释 ...
随机推荐
- Python3+Requests+Excel完整接口自动化框架
框架整体使用Python3+Requests+Excel:包含对实时token的获取 框架结构图 1.------base -------runmethond.py runmethond:对不同的请求 ...
- hibernate关联关系一对多
1. 什么是关联(association) 1.1 关联指的是类之间的引用关系.如果类A与类B关联,那么被引用的类B将被定义为类A的属性 首先建2个实体类 Order.java package com ...
- 垃圾收集器GC
(1)DefNew(串行)收集器 Serial(串行)垃圾收集器是最基本.发展历史最悠久的收集器:JDK1.3.1前是HotSpot新生代收集的唯一选择: 特点: (1) 针对新生代采用复制算法,单线 ...
- 2019 SDN上机第5次作业
2019 SDN上机第5次作业 1.浏览RYU官网学习RYU控制器的安装和RYU开发入门教程,提交你对于教程代码的理解,包括但不限于: 描述官方教程实现了一个什么样的交换机功能? 答:官方教程实现了一 ...
- Django中的跨域请求问题
本文目录 一 同源策略 二 CORS(跨域资源共享)简介 三 CORS基本流程 四 CORS两种请求详解 五 Django项目中支持CORS 回到目录 一 同源策略 同源策略(Same origin ...
- 雅礼集训2019 D7T2 Subsequence
雅礼集训2019 D7T2 Subsequence 直接贴题解: 平衡树代码: #include<bits/stdc++.h> #define ll long long #define N ...
- vue的基础概念和语法01
vue的特点和web开发中的常见高级功能 解耦视图和数据 可复用的组件 前端路由技术 状态管理 虚拟DOM 数据响应式 不是所有元素操作都Vue都会监听并实现数据响应式 //push方法:追加 thi ...
- 14-scrapy框架(CrawlSpider)
CrawlSpider介绍 CrawlSpider是Spider的一个子类,意味着拥有Spider的方法,以及自己的方法,更加高效简洁.其中最显著的功能就是"LinkExtractors&q ...
- Jmeter-Java请求实战
1.1. jmeter-java插件实现接口测试 (linux /mysql/rabbit-mq) 本次需要准备环境 Eclipse+jdk8 Jmeter Python 1.1.1. Rabbit- ...
- ActiveMQ是什么,为什么使用MQ
是基于 Java 中的 JMS 消息服务规范实现的一个消息中间件. 1.系统解耦 采用中间件之后,就可以完美解决上述中因为耦合可能导致的问题.系统 A 不用去 关心下层服务调用方的问题. 2. 异步调 ...