线程基础知识
线程是程序的执行单元,Java虚拟机允许一个应用中有多个线程并发执行。
每个线程都有优先级,优先级高的先执行。每个线程可以被设置成为守护线程。父线程创建子线程时,子线程的优先级,是否守护线程标识与父线程保持一致。
线程分类
在Java中有两类线程:
- 用户线程 (User Thread)
- 守护线程 (Daemon Thread)
所谓守护线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。
用户线程和守护线程两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果用户线程已经全部退出运行了,只剩下守护线程存在了,虚拟机也就退出了。 因为没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了。
虚拟机运行何时退出
虚拟机启动时通常都会有一个非守护线程在执行。虚拟机会持续运行,直到遇到下列情形:
- 运行时调用了Runtime.exit()方法
- 所有的非守护线程都运行结束了
- 线程内部Run方法内部抛出异常,且传播到外面
线程状态流转分析
Thread核心方法
- wait(当前线程进入等待状态,且释放锁资源)
- join(底层调用wait方法,因此当前线程会进入等待状态,释放锁资源)
- sleep(当前线程进入TIMED_WAITING状态,不释放锁资源)
- yield(高速调度器当前线程让出CPU资源,调度器可以忽略此操作,很少使用)