用户线程
定义:平时用到的普通线程均是用户线程,当在Java程序中创建一个线程,它就被称为用户线程。也就是我们创建出来的那些
守护进程
服务线程,准确地来说就是服务其他的线程,这是它的作用——而其他的线程只有一种,那就是用户线程。所以java里线程分2种,
1、守护线程,比如垃圾回收线程,就是最典型的守护线程。
2、用户线程,就是应用程序里的自定义线程
守护进程是运行在程序后台的线程
守护进程创建的进程,依然时守护进程
守护进程不会影响jvm的退出,当jvm只剩余守护进程时,jvm 进行退出
守护进程在jvm退出时,自动销毁
在守护线程中启动的子线程也是守护线程
守护线程不建议进行写操作, 因为守护进程随时可能结束。
守护进程和用户进程的区别
守护进程也叫做“后台进程”,“服务进程”,与用户进程最大的区别在于如果用户进程已经全部退出运行,只剩下守护进程存在,那么java虚拟机就会退出,即只要用户进程结束,不管此时守护进程是否已经结束,虚拟机都会结束。
线程的生命周期
在图中可以看到一个线程的所有状态,我们先了解一下这些状态的含义。
- NEW – 初始状态,一个新创建的线程,还没开始执行。
- RUNNABLE – 可执行的状态,要么是在执行,要么是一切就绪等待执行,例如等待分配CPU时间。
- WAITING – 等待状态,等待其他的线程去执行特定的动作,没有时间限制。
- TIMED_WAITING – 限时等待状态,等待其他的线程去执行特定的动作,这个是在一个指定的时间范围内。
- BLOCKED – 阻塞状态,等待锁,以便进入同步块儿。
- TERMINATED – 终止状态,线程执行结束。
我们使用start()创建线程的时候并不是说这个线程是开始运行了,而是说它可以去抢占CPU的资源了,也就是进入了Runnable,等到它抢到了资源之后才会进入运行状态Running,我们可以使用yield()直接放弃CPU资源进入Runnable,我们使用sleep()、join()就可以进入阻塞Blocked状态,当sleep()、join()或者IO结束就会重新进入Runnable状态去抢夺资源