Skip to content

Latest commit

 

History

History
322 lines (289 loc) · 10.6 KB

Thread.md

File metadata and controls

322 lines (289 loc) · 10.6 KB

本来想看 ThreadLocal 的源码的,但发现其中最重要的 get/set 方法都是操纵的 Thread 类 中的 threadLocals 变量 (java.lang.ThreadLocal.ThreadLocalMap),索性先来看一下 Thread 的源码吧,可以留意一下其中与 ThreadLocal 相关的属性,这样下次阅读 ThreadLocal 的核心 API 时,就能够轻易理解其原理咯。不多 BB,直接上硬菜。

实现多线程从本质上都是由 Thread 类 来完成的,其源码量很多,本次只看一些常见且重要的部分,源码和解析如下。

publicclassThreadimplementsRunnable { /** 这里只看一些 常见的参数 *//** 线程名 */privatevolatilecharname[]; /** 优先级 */privateintpriority; /** 是否为守护线程 */privatebooleandaemon; /** 线程要执行的目标任务 */privateRunnabletarget; /** 所属线程组 */privateThreadGroupgroup; /** 类加载器 */privateClassLoadercontextClassLoader; /** * ThreadLocal 能为线程设置线程私有变量 就是通过下面这个threadLocals变量完成的, * ThreadLocal的get/set方法就是通过操作 各个线程的 threadLocals 变量实现的。 * 1、线程A持有一个 ThreadLocalMap 变量; * 2、线程A调用一个类的 ThreadLocal变量 tlA 的 get/set方法; * 3、tlA(ThreadLocal)的 get/set方法 获取当前线程A,调用 线程A 的 ThreadLocalMap变量 的get/put方法; * 4、其它线程 调用 tlA(ThreadLocal)的 get/set方法 同理。 */ThreadLocal.ThreadLocalMapthreadLocals; ThreadLocal.ThreadLocalMapinheritableThreadLocals; /** 线程栈的大小 */privatelongstackSize; /** * Thread类定义了6个线程状态:New、Runnable、Blocked、Waiting、TimedWaiting、Terminated(终止) * 实际上还会把 Runnable 再细分为 就绪(未抢到时间片) 和 运行中(抢到时间片) */privatevolatileintthreadStatus; /** 最小优先级 */publicstaticfinalintMIN_PRIORITY = 1; /** 中等优先级 */publicstaticfinalintNORM_PRIORITY = 5; /** 最大优先级 */publicstaticfinalintMAX_PRIORITY = 10; /** * 内部枚举类,用来描述线程状态,状态值有: * NEW: 新建,还未调用start()方法; * RUNNABLE: 运行,在java多线程模型中,就绪和运行都是运行状态; * BLOCKED: 阻塞; * WAITING: 等待,需要其他的线程来唤醒; * TIMED_WAITING:超时等待,可以在指定的时间内自动醒来,如 sleep()方法; * TERMINATED: 终止,线程执行完毕。 */publicstaticfinalclassStateextendsEnum { publicstaticfinalStateNEW; publicstaticfinalStateRUNNABLE; publicstaticfinalStateBLOCKED; publicstaticfinalStateWAITING; publicstaticfinalStateTIMED_WAITING; publicstaticfinalStateTERMINATED; privatestaticfinalStateVALUES[]; static { NEW = newState("NEW", 0); RUNNABLE = newState("RUNNABLE", 1); BLOCKED = newState("BLOCKED", 2); WAITING = newState("WAITING", 3); TIMED_WAITING = newState("TIMED_WAITING", 4); TERMINATED = newState("TERMINATED", 5); VALUES = (newState[] { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED }); } privateState(Strings, inti) { super(s, i); } } /** * 一系列 构造方法 ------------------------------------------------------ * 可以看出来,其中都调用了init()方法,这也是一个约定俗成的规矩, 即,如果要在 new 时进行一些初始化操作, * 那么请将初始化操作单独写在 init()方法中,然后在构造函数中调用该 init()方法 */publicThread() { daemon = false; stillborn = false; threadLocals = null; inheritableThreadLocals = null; threadStatus = 0; blockerLock = newObject(); init(null, null, (newStringBuilder()).append("Thread-").append(nextThreadNum()).toString(), 0L); } publicThread(Runnablerunnable) { daemon = false; stillborn = false; threadLocals = null; inheritableThreadLocals = null; threadStatus = 0; blockerLock = newObject(); init(null, runnable, (newStringBuilder()).append("Thread-").append(nextThreadNum()).toString(), 0L); } Thread(Runnablerunnable, AccessControlContextaccesscontrolcontext) { daemon = false; stillborn = false; threadLocals = null; inheritableThreadLocals = null; threadStatus = 0; blockerLock = newObject(); init(null, runnable, (newStringBuilder()).append("Thread-").append(nextThreadNum()).toString(), 0L, accesscontrolcontext); } publicThread(ThreadGroupthreadgroup, Runnablerunnable) { daemon = false; stillborn = false; threadLocals = null; inheritableThreadLocals = null; threadStatus = 0; blockerLock = newObject(); init(threadgroup, runnable, (newStringBuilder()).append("Thread-").append(nextThreadNum()).toString(), 0L); } publicThread(Strings) { daemon = false; stillborn = false; threadLocals = null; inheritableThreadLocals = null; threadStatus = 0; blockerLock = newObject(); init(null, null, s, 0L); } publicThread(ThreadGroupthreadgroup, Strings) { daemon = false; stillborn = false; threadLocals = null; inheritableThreadLocals = null; threadStatus = 0; blockerLock = newObject(); init(threadgroup, null, s, 0L); } publicThread(Runnablerunnable, Strings) { daemon = false; stillborn = false; threadLocals = null; inheritableThreadLocals = null; threadStatus = 0; blockerLock = newObject(); init(null, runnable, s, 0L); } publicThread(ThreadGroupthreadgroup, Runnablerunnable, Strings) { daemon = false; stillborn = false; threadLocals = null; inheritableThreadLocals = null; threadStatus = 0; blockerLock = newObject(); init(threadgroup, runnable, s, 0L); } publicThread(ThreadGroupthreadgroup, Runnablerunnable, Strings, longl) { daemon = false; stillborn = false; threadLocals = null; inheritableThreadLocals = null; threadStatus = 0; blockerLock = newObject(); init(threadgroup, runnable, s, l); } privatevoidinit(ThreadGroupthreadgroup, Runnablerunnable, Strings, longl) { init(threadgroup, runnable, s, l, null); } /** * 初始化线程 */privatevoidinit(ThreadGroupthreadgroup, Runnablerunnable, Stringname, longl, AccessControlContextaccesscontrolcontext) { // 参数校验,线程name不能为nullif (name == null) thrownewNullPointerException("name cannot be null"); this.name = name.toCharArray(); // 当前线程就是该线程的父线程Threadparent = currentThread(); SecurityManagersecuritymanager = System.getSecurityManager(); if (threadgroup == null) { if (securitymanager != null) threadgroup = securitymanager.getThreadGroup(); if (threadgroup == null) threadgroup = parent.getThreadGroup(); } threadgroup.checkAccess(); if (securitymanager != null && isCCLOverridden(getClass())) securitymanager.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION); threadgroup.addUnstarted(); // 守护线程、优先级等设置为父线程的对应属性group = threadgroup; daemon = parent.isDaemon(); priority = parent.getPriority(); if (securitymanager == null || isCCLOverridden(parent.getClass())) contextClassLoader = parent.getContextClassLoader(); elsecontextClassLoader = parent.contextClassLoader; inheritedAccessControlContext = accesscontrolcontext == null ? AccessController.getContext() : accesscontrolcontext; target = runnable; setPriority(priority); if (parent.inheritableThreadLocals != null) // 创建线程共享变量副本inheritableThreadLocals = ThreadLocal.createInheritedMap(parent.inheritableThreadLocals); stackSize = l; // 分配线程idtid = nextThreadID(); } publicsynchronizedvoidstart() { //假若当前线程初始化还未做好,不能start,0->NEW状态if (threadStatus != 0) thrownewIllegalThreadStateException(); //通知group该线程即将启动,group的未启动线程数量减1group.add(this); booleanstarted = false; try { // 调用native的start0()方法 启动线程,启动后执行run()方法start0(); started = true; } finally { try { //启动不成功,group设置当前线程启动失败if (!started) { group.threadStartFailed(this); } } catch (Throwableignore) { } } } privatenativevoidstart0(); publicvoidrun() { if (target != null) target.run(); } /** * 请求终止线程。interrupt不会真正停止一个线程,它仅仅是给这个线程发了一个信号, * 告诉它要结束了,具体要中断还是继续运行,将由被通知的线程自己处理 */publicvoidinterrupt() { if (this != Thread.currentThread()) checkAccess(); synchronized (blockerLock) { Interruptibleb = blocker; if (b != null) { interrupt0(); b.interrupt(this); return; } } interrupt0(); } privatenativevoidinterrupt0(); /** * 线程main 调用了线程A的join方法,则 线程main 会被阻塞,直到线程A执行完毕 */publicfinalvoidjoin() throwsInterruptedException { join(0); } /** * 实际上是利用 wait/notify机制 来实现的 */publicfinalsynchronizedvoidjoin(longmillis) throwsInterruptedException { longbase = System.currentTimeMillis(); longnow = 0; if (millis < 0) { thrownewIllegalArgumentException("timeout value is negative"); } // millis 为 0,所以走这个分支if (millis == 0) { // 当前线程是否还在运行,还在运行 则main线程 进入等待状态,直到 A线程运行完毕,将其唤醒while (isAlive()) { wait(0); } } else { while (isAlive()) { longdelay = millis - now; if (delay <= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; } } } /** * 线程睡眠指定的时间,释放CPU资源,但不释放锁 */publicstaticnativevoidsleep(longmillis) throwsInterruptedException; /** * 线程是否还在运行 */publicfinalnativebooleanisAlive(); }

之前一直对线程状态 及 状态切换的概念模糊不清,现在通过源码中对线程状态的定义,我们可以画张图来重新回顾一下,以使我们对其有更加深刻的理解。

avatar

close