线程状态
- New:创建并未启动
- Runnable:JVM中执行时
- Blocked:被阻塞等待监视器锁定
- Waiting:等待其它线程完成指定动作
- Time Waiting:等待其它线程到达指定时间
- Terminated:线程已退出执行, 已经终止或中断的线程不能再被启动
// 输出线程状态
public class TestState {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
//设置延迟
for (int i = 0; i < 2; i++) {
try {
Thread.sleep(1000);
System.out.println("/");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
// 状态打印
Thread.State state = thread.getState();
System.out.println("未启动时状态:"+state);
thread.start();
state = thread.getState();
System.out.println("启动时状态:"+state);
// 输出中间循环状态
while (state != Thread.State.TERMINATED){
try {
Thread.sleep(100);
state = thread.getState();
System.out.println("启动后状态:"+state);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
未启动时状态:NEW
启动时状态:RUNNABLE
启动后状态:TIMED_WAITING
启动后状态:TIMED_WAITING
启动后状态:TIMED_WAITING
启动后状态:TIMED_WAITING
启动后状态:TIMED_WAITING
启动后状态:TIMED_WAITING
启动后状态:TIMED_WAITING
启动后状态:TIMED_WAITING
启动后状态:TIMED_WAITING
/
启动后状态:TIMED_WAITING
启动后状态:TIMED_WAITING
启动后状态:TIMED_WAITING
启动后状态:TIMED_WAITING
启动后状态:TIMED_WAITING
启动后状态:TIMED_WAITING
启动后状态:TIMED_WAITING
启动后状态:TIMED_WAITING
启动后状态:TIMED_WAITING
启动后状态:TIMED_WAITING
/
启动后状态:TERMINATED
sleep
sleep模拟网络延时:放大问题发生性
sleep模拟倒计时
import java.text.SimpleDateFormat;
import java.util.Date;
// sleep 线程睡眠模拟倒计时
public class TestSleep2 {
public static void main(String[] args) {
printTime();
}
public static void printTime(){
Date startTime = new Date(System.currentTimeMillis());
while (true){
try {
Thread.sleep(1000);
System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));
startTime = new Date(System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
19:27:06
19:27:07
19:27:08
19:27:09
19:27:10
19:27:11
19:27:12
yield
线程礼让;让出当前时间片执行权,但是不一定成功;
// 线程礼让
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{
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "开始执行。");
Thread.yield();// 礼让
System.out.println(Thread.currentThread().getName() + "结束执行。");
}
}
a开始执行。
a结束执行。
b开始执行。
b结束执行。a开始执行。
b开始执行。
b结束执行。
a结束执行。
join
线程插队:强行让当前线程获取执行权;
// jion 线程抢占
public class TestJoin implements Runnable{
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("插队执行" + i);
}
}
public static void main(String[] args) {
TestJoin testJoin = new TestJoin();
Thread t = new Thread(testJoin);
t.start();
for (int i = 0; i < 10; i++) {
// 设置插队位置
if (i == 7){
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("主线程" + i);
}
}
}
主线程0
主线程1
主线程2
主线程3
主线程4
主线程5
主线程6
插队执行0
插队执行1
插队执行2
插队执行3
插队执行4
主线程7
主线程8
主线程9