线程状态
创建状态、就绪状态、运行状态、阻塞状态、死亡状态
线程停止
package com.thread.state;
//测试stop
//1.建议线程正常停止——>利用次数,不建议死循环
//2.建议使用标志位——>设置一个标志位
public class TestStop implements Runnable{
//1.设置一个标志位
private boolean flag = true;
线程休眠_sleep
-
sleep (时间)指定当前线程阻塞的毫秒数,1000毫秒=1秒;
-
sleep存在异常InterruptedException;
-
sleep时间达到后线程进入就绪状态;
-
sleep可以模拟网络延时,倒计时等;
-
每一个对象都有一个锁, sleep不会释放锁。
package com.thread.state;
//模拟倒计时
public class TestSleep2 {
public static void main(String[] args) {
try {
tenDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//模拟倒计时
public static void tenDown() throws InterruptedException {
int num = 10;
while(true){
Thread.sleep(1000);
System.out.println(num--);
if (num<=0){
break;
}
}
}
}
线程礼让_yield
-
礼让线程:当前正在执行的线程暂停(A),但不阻塞
-
线程(A)从运行状态转为就绪状态
-
让CPU重新调度(A和B),但再次调度还是看CPU心情让谁先进,所以礼让不一定成功!!
package com.thread.state;
//礼让线程
//礼让不一定成功,看CPU心情
public class TestYield {
public static void main(String[] args) {
MyYield myYield = new MyYield();
new Thread(myYield,"a").start();
new Thread(myYield,"b").start();
}
}
class MyYield implements Runnable{
线程强制执行_join
-
可以想象成插队
-
待此线程执行完后,再执行其他线程
package com.thread.state;
import com.exception.demo01.Test;
//测试join方法
public class TestJoin implements Runnable{
观测线程状态
package com.thread.state;
//观察测试线程的状态
public class TestState {
//线程体
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(()->{
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("/////////");
});
//观察状态(目前应该是new)
Thread.State state = thread.getState();
System.out.println(state);//new
//观察启动后(应该是run)
thread.start();//启动线程
state = thread.getState();
System.out.println(state);//run
//只要线程不终止,就一直输出状态
while(state!=Thread.State.TERMINATED){
Thread.sleep(100);//每0.1秒更新一次状态
state = thread.getState();//更新线程状态
System.out.println(state);//输出状态
}
}
}