线程状态:5大状态:新生、就绪、运行、阻塞、死亡
* 新生:线程对象创建就进入新生状态,每个线程有自己的工作内存。
* 就绪:调用了start方法就进入就绪状态,但不代表会被立即调度;阻塞事件解除,进入就绪状态;
* 运行时调用yield(礼让线程,暂停,让出CPU的调度,等待调度)方法,进入就绪状态;jvm
* 将CPU从本地线程切换到其他线程,进入就绪状态。
* 运行:调度之后,进入运行状态,才真正执行线程体的代码块
* 阻塞:调用sleep(抱着资源睡觉,每个对象都有一个锁,sleep不会释放锁;sleep(毫秒)可以用
* 来模拟网络延迟或倒计时)、wait(在一边等,没有占用资源)、join(加入、插队,需要thread
* 的对象调用)方法;IO流中的read、write方法。
* 死亡:代码执行完正常结束;被强制中断执行,stop/destroy方法,不推荐使用,不安全,
* 可以通过标识来控制:1.加入标识;2.关联标识;3.对外提供方法改变标识;4.调用,终止
* state类可以通过thread对象.getState方法来获取状态:NEW:新生;RUNNABLE:就绪、运行:
* TIMED_WAITING:阻塞---有时间的等待;BOLCKED:阻塞----锁定;WATING:阻塞---等待;
* TERMINATED:结束
下面代码是获取状态、通过标识来控制线程和sleep的使用。
public class TestStatus implements Runnable{
//1.加入标识 标记线程体是否可以运行
private boolean flag = true;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public TestStatus(String name) {
this.name = name;
}
@Override
public void run() {
int i = 0;
while (flag){//2.flag = true 继续flag = false 停止
System.out.println(name+"----"+i++);
}
}
//3.对外提供方法改变标识
public void terminate(){
this.flag = false;
}
public static void main(String[] args) {
TestStatus ts = new TestStatus("小白");
Thread thread = new Thread(ts);
System.out.println("状态1:"+thread.getState());
thread.start();
System.out.println("状态2:"+thread.getState());
for (int i = 0; i < 99; i++) {
try {
Thread.sleep(5);
System.out.println("状态3:"+thread.getState());
} catch (InterruptedException e) {
e.printStackTrace();
}
if(i==88){
ts.terminate();//4.线程终止
System.out.println("over");
}
System.out.println("main----"+i);
}
System.out.println("状态4:"+thread.getState());
}
}
yield礼让线程这里有用到
主要掌握sleep方法,wait方法一般和notify配合使用,一个等待,一个唤醒等待。后面线程协作会用到。