-
线程的生命周期:
一个线程从创建到消亡的过程。 -
四种状态:
创建状态
可运行状态(就绪状态)
运行状态
不可运行状态(堵塞状态)
消亡状态 -
线程状态转换图:
-
创建状态:
当使用new创建一个新的线程对象时,处于创建状态。
处于创建状态的线程只是 一个空的线程对象,系统不为它分配资源。 -
可运行状态(就绪状态):
执行线程的 start()方法,线程进入线程队列排队,等待CPU为线程分配必须的系统资源,这样就使得该线程处于可运行(Runable)状态。
这个状态不是运行中状态(Running),因为线程也许实际上并未真正运行。 -
运行状态:
就绪状态的线程被调用,并且获得处理器资源时,线程就进入了运行状态, 并调用线程体的run()方法。如果给定的CPU时间用完或者调用yield()方法,运行状态的线程可能就会进入就绪状态。 -
不可运行状态(堵塞状态):
当发生下列事件时,处于运行状态的线程会转入到不可运行状态。
- 调用了sleep()方法;
- 线程调用wait()方法等待特定条件的满足;
- 线程输入/输出阻塞;
- 返回可运行状态:
处于睡眠状态的线程在指定时间过去后;
如果线程在等待某一个条件,另一个对象必须通过notify() 或者notifyAll()方法通知等待线程条件的改变;
如果线程因为输入/输出阻塞,等待输入/输出完成; - 消亡状态:
线程的run()方法结束之后,该线程自然消亡。 - 线程调度策略:
线程调度器选择优先级最高的线程运行,但是特殊情况还是会终止线程的运行。
线程体中调用了yield()方法,让出了对CPU的占用权。
线程体中调用了sleep()方法,使线程进入睡眠状态。
线程由于I/O操作而受阻塞。
另一个更高于优先级的线程出现。
在支持时间片的系统中,该线程的时间片用完。 - 关于成员变量与局部变量 对于Runnable类型:
如果一个类继承Thread类,则不适合多个线程共享资源,而实现了Runnable接口,就可以方便的实现资源共享。
如果一个变量是成员变量。那么多个线程对于同一个对象的成员变量进行操作时,他们对该成员变量是彼此影响的( 也就是说一个线程对成员变量的改变会影响另一个线程)。
如果一个变量是局部变量,那么每个线程都会有一个局部变量的拷贝, 一个线程对该局部变量的改变不会影响到其他线程。