章节目录
- 1.线程定义
- 2.使用多线程的优势
- 3.线程优先级
- 4.线程的状态
- 5.Daemon 线程
1.线程定义
进程与线程的区别
1.进程是cpu进行资源分配的独立单位,指的是程序在数据集合上的一次运行过程。
2.线程是cpu 进行调度的最小单位,在一个进程中会创建多个线程。
AI 代码解读
线程拥有的独立资源
栈中数据是线程独享的,包括局部变量、程序计数器等 堆中数据是线程共享的,如线程同时操作堆中某对象的某属性。
AI 代码解读
Java程序运行的实质
一个程序的运行不仅仅是main()方法的运行,而是main线程和多个其他线程共同运行
AI 代码解读
2.使用多线程的优势
1.充分利用更多的处理核心
2.更快的响应时间
例如,一笔订单的创建,它包括插入订单数据,生成订单快照,发送邮件通
知买家和记录货品销售数量等, 用户从单击“订购按钮" 开始,就要等待这些操
作全部完成才能看到订购成功的结果,但是这么多的业务操作,如何才能够跟快的完成?
在上面的场景中,我们可以使用多线程技术,即将数据一致性不强的操作派发
给其他线程处理,好处是响应用户请求的线程能更快的处理完成,缩短了响应时间,提升了用户体验。
AI 代码解读
3.线程优先级
thread.setPriority(10),线程优先级从1-10顺序排列
4.线程的状态
Java线程在运行的声明周期中可能处于如下表所示的6中状态,在给定的一个时刻,线程只能处于其中一个状态。
状态名称 | 说明 |
---|---|
new | 初始状态,线程被构建,但是还没有调用start()方法 |
runnable | 运行状态,Java线程将操作系统中的就绪与运行两种状态统称为"运行中" |
block | 阻塞状态,表示线程等待资源可用,如i/o 或者阻塞于锁 |
waiting | 等待状态,表示线程进入等待状态,进入该状态表示当前线程需要等待其他线程做出一些特定动作(通知或中断) |
time_waiting | 超时等待状态,该状态不同于waiting,它是可以在指定的时间自行返回的 |
terminated | 终止状态,表示当前线程执行完毕 |
如下图所示,为java线程状态变迁图:

java线程状态变迁图
1.线程创建之后,调用start()方法,状态变更为可运行状态,待资源准备就绪后,开始运行。
2.线程执行 lockObject.wait() 方法,线程进入等待状态。
3.进入等待状态的线程依靠其他线程的通知才能返回到运行状态。
4.超时等待相当于在等待状态基础上增加超时限制,超时时间到达会自动返回到运行状态。
5.线程调用同步方法,在没有获取锁的情况下,线程会进入到阻塞状态。
6.线程在执行Runable 的run()方法后,进入终止状态。
Daemon线程
支持性线程,被用作程序中后台调度以及支持性工作。
当一个Java虚拟机中不存在非Daemon线程时,JVM将退出。
可以通过调用Thread.setDaemon(true)将线程设置为Daemon线程。
Daemon属性需要在启动线程前执行,不能在启动线程之后启动。
注意:Daemon线程被用作完成支持性工作,但在Java虚拟机退出时,Daemon线程中的finally不一定会执行。
如下代码所示:
public class Daemon {
static class DaemonRunner implements Runnable {
public void run(){
try{
TimeUnit.Second.sleep(10);//沉睡10s
}finally{
System.out.println("Daemon thread finally run");//执行类似资源回收动作
}
}
}
}
AI 代码解读
当JVM中已经没有非Daemon线程,虚拟机就要退出。JVM中所有Daemon线程需要立即终止,因此finally块并没有执行。