并发编程学习笔记(七、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()添加许可证,潜在地释 ...
随机推荐
- DWR服务器推送技术
参考博客:https://blog.csdn.net/Marksinoberg/article/details/55505423 下载Dwr.jar文件 到官网http://directwebremo ...
- spring mongodb用法
A field annotated with @Id (org.springframework.data.annotation.Id) will be mapped to the '_id' fiel ...
- 【bzoj4945】[Noi2017]游戏(搜索+2-sat)
bzoj 洛谷 题意: 现在有\(a,b,c\)三种车,每个赛道可能会存在限制:\(a\)表示不能选择\(a\)类型的赛车,\(b,c\)同理:\(x\)表示该赛道不受限制,但\(x\)类型的个数$\ ...
- poj 3233 矩阵快速幂
地址 http://poj.org/problem?id=3233 大意是n维数组 最多k次方 结果模m的相加和是多少 Given a n × n matrix A and a positive i ...
- 使用 github pages快速部署自己的静态网页
看见很多大神在Github Pages上部署Demo,感觉效果还不错,刚才自己也试了一下,发现其实并不难! 选择 github pages 的理由 使用零成本: github pages 集成在 gi ...
- 大学ACM学习笔记
高斯消元 该来的总会来的系列 int gauss() { for(int i=1;i<=n;i++)//按照列来枚举,当前之前i-1列全消完了 { int k=i; for(int j=i+1; ...
- 用arthas的watch方法观察执行方法的输入输出
watch 的参数比较多,主要是因为它能在 4 个不同的场景观察对象 参数名称 参数说明 class-pattern 类名表达式匹配 method-pattern 方法名表达式匹配 express 观 ...
- Python解释器和Python集成环境小结
目录 一.执行Python程序的两种方式 1.1 交互式 1.2 命令行式 二.执行Python程序的两种IDE 2.1 Pycharm 2.2 Jupyter 一.执行Python程序的两种方式 1 ...
- shutil模块(了解)
目录 一.shutil模块 1.1 zipfile压缩解压缩 1.2 tarfile压缩解压缩 一.shutil模块 高级的文件.文件夹.压缩包处理模块. import shutil # shutil ...
- MySQL数据库实战之优酷
目录 一.项目总结三步骤 二.项目需求分析 三.搭建框架 四.ORM框架分析 五.数据库设计 六.项目中各个功能模块分析 七.项目中遇到的问题及怎么解决的 八.客户端代码框架 8.1 conf 8.1 ...