目录:

  • 常见属性
  • 构造函数
  • 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. docker 网络设置概述

    docker有3种网络: 使用命令docker network ls,执行结果如下. NETWORK ID NAME DRIVER SCOPE 82e8822065c7 bridge bridge l ...

  2. JVM java内存区域的介绍

    jvm虚拟机在运行时需要用到的内存区域.广泛一点就是堆和栈,其实不然,堆和栈只是相对比较笼统的说法,真正区分有如下几个 先上图一: 总的就是 java的内存模型 内存模型又分堆内存(heap)和方法区 ...

  3. JSON格式日期的转换

    扒来的链接: https://blog.csdn.net/zhang33565417/article/details/99676975 感谢这位哥们儿的分享!

  4. PAT甲级|1151 LCA in a Binary Tree 先序中序遍历建树 lca

    给定先序中序遍历的序列,可以确定一颗唯一的树 先序遍历第一个遍历到的是根,中序遍历确定左右子树 查结点a和结点b的最近公共祖先,简单lca思路: 1.如果a和b分别在当前根的左右子树,当前的根就是最近 ...

  5. CSS3的nth-child() 选择器

    CSS3的nth-child() 选择器,表格奇偶行变色 nth-child() 应用背景 CSS3的nth-child() 选择器,我之前很少用,在做表格偶数行变色的时候,我通常在绑定的时候,做一个 ...

  6. number.toFixed和Math.round与保留小数

    如果你baidu/google过或者自己写过保留两位小数,那下面这代码一定不陌生 Math.round(number*100)/100 那你使用过Number.prototype.toFixed这个方 ...

  7. 第04组 Beta冲刺(4/5)

    队名:new game 组长博客 作业博客 组员情况 鲍子涵(队长) 过去两天完成了哪些任务 地图移动 接下来的计划 素材和脚本相连 引入声音素材 还剩下哪些任务 让游戏本体运行 遇到了哪些困难 时间 ...

  8. 终端中的 zsh 和 bash-魔法切换

    常用ubuntu,这两个终端都装了,平时使用zsh比较方便,可是,有时候出现了问题,不知道是谁的问题时候,还要做一下切换操作的,怎么才能迅速切换呢? 要切换,首先要知道你现在使用的是什么,请看第一个命 ...

  9. idea配置pyspark

    默认python已经配好,并已经导入idea,只剩下pyspark的安装 1.解压spark-2.1.0-bin-hadoop2.7放入磁盘目录 D:\spark-2.1.0-bin-hadoop2. ...

  10. 前端笔记之React(七)redux-saga&Dva&路由

    一.redux-saga解决异步 redux-thunk 和 redux-saga 使用redux它们是必选的,二选一,它们两个都可以很好的实现一些复杂情况下redux,本质都是为了解决异步actio ...