Thread 相关类
以java.lang.Thread这中心,与之最近的类ThreadLocal、ThreadGroup等
java.lang.Thread类
#####标识属性
-
name
一个char数组,可以在构造函数中传入。如果没有传入,有一个threadInitNumber
的类变量。通过同步类方法nextThreadNum()
获取。实现Thread-threadInitNumber
的效果。这点通过IDE的Debug都可以清楚看到 -
tid
一个long变量,无法通过构造函数传入。Thread内部有一个threadSeqNumber
类变量和一个nextThreadID()
类函数,呈现的是一个自增的效果。
#####状态属性
-
priority
线程的优先级。从1到10。Thread内部定义了三个属性MIN_PRIORITY
、NORM_PRIORITY
、MAX_PRIORITY
。从构造函数中可以看到,priority的值与他parent
父线程一样。priority
字面上说是优先级,但是优不优先,得看VM实现,而是jdk中说不用保证值大的就一定优先。 -
daemon
是否是守护线程。这个概念有点模糊,我们可以叫他护卫线程。护卫谁?主线程,主线程一执行完毕,他就得死翘翘,就像护卫守护主子一样,主子挂了,护卫也可以散了。 调用setDaemon
方法必须保证线程活着,而且没有启动(start
)。daemon
默认是false
,和priority一样,daamon也是继承父线程的值。
其他常用属性
-
target
一个Runable
接口类型的对象,执行的对象。 -
group
ThreadGroup
类型,线程所在线程组。 -
threadLocarls
与inheritableThreadLocals
ThreadLocal.ThreadLocalMap
,线程持有的线程本地变量Map。后者是从父线程继承而来。
native方法
-
currentThread()
类方法,返回当期执行的线程。和this
是和区别的。因为this是指当前操作的对象,这个对象可能是Thread
,也可能不是,而currentThread()
返回的是当前执行的线程。 -
yield()
类方法,让当前线程让出CPU执行时间,让其他线程去占用CPU执行时间。当然让出之后,也有可能马上又获得。但是调用yield()
不会释放对象锁。 -
sleep(……)
类方法,让当前线程休眠给定时间长度。他不会让出CPU执行时间,出不会释放对象锁。 -
isAlive()
返回线程是否成活,成活的意思就是线程已经开始,并且没有死亡。 -
holdsLock(……)
类方法,返回线程是否持有给定对象锁。
常用方法
-
start()
线程启动方法,会配合线程组。调用本地方法start0()
。 -
run()
线程任务执行内容,如果target
不为空,就执行target
的run()
方法。那如果target
为空啦?这种情况对应的就是继承Thread
类,一般都会覆盖run
方法。 -
stop(……)
停止进程,这个方法是过时的。 -
interrupt()
中断进程。对应本地方法interrupt0()
-
interrupted()
类方法,返回当前线程是否标识为中断。调用这个方法会清除中断标识。 -
isInterrupted()
返回线程是否标识这中断。调用这个方法不会清除中断标识。 -
suspend()
暂停进程,对应suspend0()
-
resume()
恢复进程,对应resume0()
-
activeCount()
类方法,返回当前执行进程的线程组的活动线程个数。 -
enumrate(……)
类方法,返回当前执行进程的线程组的指定长度的copy。 -
join(……)
让等待被调进程结束之后,调用进程才继续执行。
java.lang.ThreadGroup类
#####容器属性
-
nUnstartedThreads
已经加入线程组,没有开始的线程数。 -
nthreads
线程组持有的线程数 -
threads
线程组持有的 线程 -
ngroups
线程组持有的线程组数 -
groups
线程组持有的线程组 -
parent
父线程组,如果构造函数没有传入,就取当前线程的线程组,并将该线程添加到父线程组的线程组中。
其他常见属性
-
name
线程名称,传入参数。 -
destroyed
线程是否已摧毁。这个参数是保证其他方法可调用的阀门。 -
daemon
是否守护线程组,从父线程组继承而来。 -
maxPriority
最大优先级,从父线程组继承而来。当setter时,传入的值不能大于当前值,当本线程组修改时,线程组包含的所有线程组也会修改。
#####常用方法
parentOf(……)
返回当前线程组是否是传入线程组的父线程组
2.activeCount()
当前线程组持有的线程和持有线程组中子孙线程个数。
-
activeGroupCount()
返回当前线程组以及其子孙线程持有的线程组数 -
enumerate(……)
返回线程组的指定长度的copy。根据传入的参数决定是否需要递归。 -
stop()
过时的方法。停止当前执行进程。 -
interrupt()
中止线程组持有的线程和持有线程组中子孙线程。 -
suspend()
过时方法,暂停当前执行线程 -
resume()
过时方法,恢复线程组持有的线程和持有线程组中子孙线程。
#####容器方法
-
add(……)
同步方法。增加一个线程到线程组中。 -
threadStartFailed(……)
同步方法,修改失败时调用。会将失败移除线程组。 -
threadTerminated(……)
同步方法,终止线程。如果本线程组是守护线程组。而且没有线程,也没有线程组,没有未开始的线程,就会摧毁线程组。 -
remove(……)
同步方法,移除线程。如果本线程组是守护线程组。而且没有线程,也没有线程组,没有未开始的线程,就会摧毁线程组。 -
addUnstarted(……)
同步方法,增加一个没有开始的线程数。 -
destroy()
同步方法,摧毁线程组以及其子孙线程持有的线程组数。
###java.lang.ThreadLocal类
#####属性
-
nextHashCode
类变量,AtomicInteger
类型,下一个哈希值。 -
threadLocalHashCode
当前对象的哈希值;
常用方法
-
get()
获取ThreadLocal变量的值,内部实现是在当前线程的ThreadLocalMap中,用this
取值,如果没有就返回初始值(null
)。 -
set(……)
取当前线程的ThreadLocalMap,如果没有就创建。然后赋值。 -
remove()
取当前线程的ThreadLocalMap,移除key为当前对象的值。
ThreadLocal.ThreadLocalMap类
一个不同与HashMap的类。内部维护一个ThreadLocal.ThreadLocalMap.Entry的数组table。
- table的初始值为16。扩容阀值是2/3。扩容大小是2倍。
- Map的索引是ThreadLocal的哈希值与长度的按位与。