线程的生命周期
Java线程状态
Java中线程共有以下六种状态:
- New:线程新建状态,创建但还未启动的新线程的状态
- Runnable:线程可运行状态,包含操作系统中线程两种状态Ready和Running,也就是说无论线程是正在运行还是等待CPU调度都属于该状态
- Block:线程阻塞状态,Java将线程阻塞状态进一步细分为下面三种状态
- Blocked:线程被阻塞状态,当线程进入同步代码块或同步方法,并且锁已被占用时线程所处的状态
- Waiting:线程等待状态,当线程在无限期等待另一个线程的特别动作时的状态
- Timed Waiting:线程计时等待状态,当线程在有期限等待另一个线程的特别动作时的状态
- Terminated:线程终止状态,线程执行完毕(包括抛出异常的情况)
代码中查看Java线程状态
非阻塞状态
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> {
for (int i = 0; i < Integer.MAX_VALUE; i++) { //为了让程序运行时间足够长
if (Thread.currentThread().isInterrupted()) { //每次循环中检查是否收到中断信号
System.out.println("收到中断信号,进行保存工作");
return; //若收到中断信号该线程的就会执行结束
}
if (i == Integer.MAX_VALUE / 2) {
System.out.println("线程正在运行的状态:" + Thread.currentThread().getState()); //打印出RUNNABLE的状态
}
}
});
System.out.println("未调用start()方法的状态:" + thread.getState()); //打印出NEW的状态
thread.start();
System.out.println("调用start()方法后的状态:" + thread.getState()); //打印出RUNNABLE的状态
Thread.sleep(5000); //等待线程结束,可适当调整时间
System.out.println(thread.getState()); //打印出TERMINATED状态
}
阻塞状态
public class Main {
private synchronized void sync() { //当另一个线程也想进入同步方法时会进入Blocked状态
try {
Thread.sleep(1000); //线程休眠会进入TimedWaiting状态
wait(); //线程等待会进入Waiting状态
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
Main main = new Main(); //为了保证多个线程使用的是同一把锁
Runnable runnable = () -> main.sync();
Thread thread1 = new Thread(runnable);
Thread thread2 = new Thread(runnable);
thread1.start();
thread2.start();
Thread.sleep(5);
System.out.println("先进入同步方法的线程状态:" + thread1.getState());
System.out.println("后进入同步方法的线程状态:" + thread2.getState());
Thread.sleep(1500);
System.out.println("执行wait()方法后的状态:" + thread1.getState());
thread1.stop();
thread2.stop();
}
}
Comments NOTHING