关于java中线程的睡眠

Python012

关于java中线程的睡眠,第1张

是的。假如T1start,T2start后,T1执行一个循环休息10000毫秒,让出CPU,T2执行一个循环休息10000毫秒,让出CPU,这时T1比T2先睡醒,T1休息完成后继续执行后又休息,T2也休息完继续进行,就这样直到线程结束。

java中,每个线程都需经历新生、就绪、运行、阻塞和死亡五种状态,线程从新生到死亡的状态变化称为生命周期。

用new运算符和Thread类或其子类建立一个线程对象后,该线程就处于新生状态。

线程的生命周期,把图转化为文字就是: 

1、线程通过new方法创建,调用start,线程进入就绪状态,等待系统的调度(时间片轮转调度)。当系统调度,进入运行状态。正常结束或者异常退出,进程进入死亡状态。

2、处于运行状态的线程若遇到sleep,则线程进入睡眠状态,不会让出资源锁,sleep结束,线程转为就绪状态,等待系统重新调度。

3、处于运行状态的线程可能在等待io,也可能进入挂起状态。io完成,转为就绪状态。

4、处于运行状态的线程yield,线程转为就绪状态。(yield只让给权限比自己高的)

5、处于运行状态的线程遇到wait,线程处于等待状态,需要notify()/notifyALL来唤醒线程,唤醒后的线程处于锁定状态,获取了“同步锁”,之后,线程才转为就绪状态。处于运行的线程synchronized,加上后 变成同步操作。处于锁定状态,获取了“同步锁”,之后,线程才转为就绪状态。

首先这个睡眠是不一定的,a是固定睡眠的,但是不一定a睡完了b就立刻执行.这存在着线程抢时间片的问题,是随机的.而这个i呢,你定义好了是没错,但是每次拿来i+1的时候i都是一个新的,也就是说你的i+1只是当前方法中执行了,并没有去影响到成员变量i.