线程生命周期
上图展示了线程从创建到结束的整个生命周期,下面从状态和控制两个方面分解图中的内容
线程状态
线程具有5中基本的状态:
- NEW(新建状态): 创建线程,还未启动
- RUNNABLE(就绪状态): 可运行状态,但还未获得时间片,等待执行
- RUNNING(执行状态): 运行状态,在就绪状态获得了时间片,进入运行状态
- BLOCKED(阻塞状态):当某些情况下,线程被阻止运行,进入阻塞状态,阻塞的状态可分为三种:
- 第一种为执行了
wait()
后会进入放入线程等待队列中,这种情况叫等待阻塞. - 第二种为等待获取
synchronized()
同步锁时,会讲线程放入同步锁队列中,等待前一个线程执行完synchronized
中的内容,这种情况叫同步阻塞. - 第三种为执行了
sleep()
或join()
时,和wait()
不同,它不会释放对象锁.
- 第一种为执行了
- TERMINATED(终止状态):当线程正常结束或异常退出时,会到达终止状态
线程方法
- run/start
需要并行处理的代码放在run()
方法中,start()
方法启动线程将自动调用run()
方法,这是由Java的内存机制规定的。并且run()
方法必须是public访问权限,返回值类型为void。 - wait
当前线程暂停执行并释放对象锁标志,让其他线程可以进入synchronized
数据块,当前线程被放入对象等待池中 - nodify/nodifyAll
唤醒等待(wait)的线程 - sleep
休眠一段时间后,会自动唤醒。但它并不释放对象锁。也就是如果有synchronized
同步块,其他线程仍然不能访问共享数据。注意该方法要捕获异常 - join
当前线程停下来等待,直至另一个调用join方法的线程终止,线程在被激活后不一定马上就运行,而是进入到可运行线程的队列中 - yield
停止当前线程,让同等优先权的线程运行。如果没有同等优先权的线程,那么yield()方法将不会起作用