守护线程(Daemon Thread)和用户线程(User Thread)
用户线程会阻止jvm的正常停止,即jvm正常停止前应用程序中的所有用户线程必须先停止完毕,否则jvm无法停止。
守护线程则不会影响jvm的正常停止,即应用程序中有守护线程在运行也不影响jvm的正常停止。
java线程和本地(Native)线程
一个Thread实例通常对应两个线程。一个是JVM中的线程(java线程),另一个是与JVM中的线程相对应的依赖于JVM宿主机操作系统的本地(Native)线程。
java语言中,子线程是否是一个守护线程取决于其父线程。
默认情况下父线程是守护线程则子线程也是守护线程,父线程是用户线程则子线程也是用户线程。
可以通过Thread实例的setDaemon方法修改这属性。
线程状态
状态
描述
NEW
一个刚创建而未启动的线程,处于该状态。
一个线程实例只能被启动一次,只可能有一次处于该状态。
Runnable
该状态可以看成是一个复合的状态。包括两个子状态READY 和RUNNINGG
线程调度器调度 从 READY--》RUNNING
BLOCKED
一个线程发起一个阻塞式I/O操作后,或者试图去获得一个由其他线程持有的锁时,相应线程会处于该状态
该状态不会占用CPU资源。
I /O操作完成或相应的锁被其他线程释放后,该线程状态又可以转换为RUNNABLE
WAITING
一个线程执行了某些方法调用之后就会处于这种无无限等待其他线程执行特定操作的状态
这些方法有:Object.wait(),Thread.join(),和LockSupport.park().
从WAITTING 转换为RUNNABLE的方法
包括:Object.notify(),Object.notifyAll(),LOckSupport.unpark(thread)
TIMED_WAITING
与WAITING类似,差别在于该状态 并非无限等待,是处于带有时间限制的等待状态。
当其他线程没有在指定时间内执行该线程所期望的特定操作时,该线程的状态自动转换为RUNNABLE
TERMINATED
已经执行结束的线程处于该状态,只可能一次处于该状态。
Thread实例的run方法正常返回或者由于抛出异常而提前终止都会导致相应线程处于该状态。
上下文切换
多线程环境,一个线程状态又RUNNABLE 转换为非RUNNABLE(BLOCKED、WAITTING或者TIMED_WAITTING)时,相应线程的上下文文信息()需要被保存,以便线程稍后再次进入RUNNABLE状态时,能够在之前的执行进度的基础上继续前进。而一个线程的状态又非RUNNABLE状态进入RUNNABLE状态时可能涉及恢复之前保存的线程上下文信息并在此基础上前进。这个对线程的上下文信息进行保存和恢复的过程就是上下文切换。
上下文切换的开销:保存和恢复线程上下文信息的开销、对线程进行调度的CPU时间开销及CPU缓存内容失效的开销。