1.线程的状态
创建new,就绪runnable,运行running, 阻塞blocked,等待time waiting,时间等待waiting,消亡dead
创建:用户创建一个线程
就绪:创建完线程不会立即进入就绪状态,需要为线程分配内存空间,等到满足所有就绪条件后,才会进入就绪状态。
运行:进入就绪状态后,需要等待获取CPU执行时间,得到CPU执行时间后,才会进入运行状态。
阻塞:运行过程中,同步块被阻塞的话会进入阻塞状态
时间等待:运行过程中,用户主动让线程睡眠的话,进入时间等待
等待:运行过程中,用户让线程等待的话,进入等待
消亡:线程执行完毕或者突然中断,就会被消亡
2.上下文切换
对于单核CPU来说,CPU在一个时刻只能运行一个线程,在 运行一个线程的过程中,转去运行另一个线程,就叫上下文切换。
上下文切换时,线程需要保存线程的运行状态,以便下次切换回来的时候继续切换之前的状态运行。
在冯诺伊曼结构的计算机中,是由CPU的控制器执行指令,每执行一条指令,程序计数器记录指令运行到哪,所以需要保存程序计数器和CPU寄存器的状态。
上下文切换就是存储和恢复CPU状态的过程,它使得线程执行能够从中断点恢复执行。
3.Thread类中的方法
start
开启一个线程
run
启动线程后,线程获得了CPU执行时间,就会执行run中的代码。
继承Thread类,需要重写run方法。
sleep
让线程睡眠,线程进入时间等待的状态。
交出CPU,CPU去执行其他任务。 如果当前线程持有对象锁,不会释放锁,相当于线程阻塞。
yield
调用yield方法会让当前线程交出CPU,不会交出锁。
和sleep区别:
1.不能控制具体交出CPU的时间。yield会让线程进入就绪状态,只要获得CPU就能执行。sleep在等待时间内是阻塞的。 2.yield只能让同等或更高优先度的线程获得CPU,sleep没有限制。
join
主线程中,调用无参join,会让主线程等待直到线程任务执行完毕。 调用有参join,就会等待一段时间。
本质是object.wait方法,会交出CPU, 释放锁
interrupt
阻塞线程调用interrupt的话,会抛出异常来中断阻塞线程。
本质是把中断标志设为true。调用isInterrupted()就能够判断中断标记的状态。
stop,destory
废弃方法。