线程可以拥有自己的操作栈,程序计数器,局部变量表等资源,它与同一进程内的其他线程共享该进程的所有资源(所有的初始化的资源,因为局部变量表往往是副本/引用副本)。
线程状态有五种:New 新建,Runnable 就绪, Running 运行 ,Blocked 阻塞,dead 终止。
下面的线程状态图,有关于的阻塞态的切换需要改一下
New新建:即采用我们的Thread/Runnable/线程池/Callable创建出来的线程
Runnable 就绪:调用start之后运行之前的状态。
Running 运行:调用run时候的状态,表明线程正在执行。线程可能会因为某些因素而退出Running,如时间,异常,锁,调度
Blocked 阻塞:
- 等待阻塞:调用了Object.wait()(进入了对象锁的Waiting Set),需要用notify来唤醒(弃用)
- 同步阻塞/锁阻塞:锁被其它线程占用(参考monitor锁的锁池)
- 主动阻塞:调用Thread的某些方法,出让CPU执行权(比如sleep,join等),或者发出了I/O请求。
Dead 死亡:线程执行完或者因异常退出了run()方法,该线程结束生命周期。
join方法用于在某一个线程的执行过程中调用另一个线程执行,等到被调用的线程执行结束后,再继续执行当前线程,如:t.join//主要用于等待t线程执行结束,main线程阻塞,若无此句,main则会执行完毕,导致结果不可测。