以下是关于Java线程状态及切换、关闭线程的完整攻略。
Java线程状态
Java线程有以下几种状态:
- NEW(新建):线程刚被创建,但是还未开始执行。
- RUNNABLE(运行):线程正在执行或等待CPU资源分配。
- BLOCKED(阻塞):线程等待获取锁以进入同步区域时被阻塞。
- WAITING(等待):线程等待其他线程执行特定操作通知它继续执行。
- TIMED_WAITING(计时等待):线程等待其他线程执行特定操作通知它继续执行,该状态具有等待时间限制。
- TERMINATED(终止):线程执行完毕。
Java线程状态切换
- 新建线程 -> 就绪线程:当线程创建,但尚未调用 start() 方法启动线程时,处于新建状态。当调用 start() 方法后,线程进入就绪状态,等待获取CPU时间片。
- 就绪线程 -> 运行线程:当某一线程获得CPU时间片后,便进入运行状态,开始执行 run() 方法中的代码。
- 运行线程 -> 休眠状态:当线程运行时调用 Thread.sleep() 方法,或等待 IO 完成等操作时,使线程进入休眠状态。
- 运行线程 -> 阻塞状态:当线程需要等待某个锁的释放时,会进入阻塞状态。例如synchronized代码块或 synchronized 关键字修饰的方法。
- 运行线程 -> 死亡状态:当 run() 方法执行完毕或通过调用 stop() 方法强制性停止线程时,线程进入死亡状态。
关闭线程,正确的姿势分享
关闭线程的方法
- 调用线程对象的 interrupt() 方法:在正常的情况下,线程会通过while循环里的wait()等方法进入等待状态,所以我们可以通过调用 interrupt() 方法使线程“醒来”,让线程自己判断是否需要结束。
Thread.currentThread().interrupt();
- 使用简单标志位终止线程:开辟一个 boolean 类型的变量标志着线程应该退出。
public class MyRunnable implements Runnable {
private volatile boolean isRunning = true;
@Override
public void run() {
while (isRunning) {
// while循环内的代码
System.out.println("线程执行");
}
}
public void stopRunning() {
this.isRunning = false;
}
}
示例说明
关闭线程示例一:使用interrupt()方法关闭线程
public class MyThread extends Thread {
@Override
public void run() {
try {
while (!Thread.currentThread().isInterrupted()){
System.out.println("线程正在运行");
Thread.sleep(1000); // 线程休眠1秒
}
} catch (InterruptedException e) {
System.out.println("线程被中断");
}
}
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
try {
Thread.sleep(5000); //主线程休眠5秒
} catch (InterruptedException e) {
e.printStackTrace();
}
thread.interrupt(); //调用interrupt()方法,关闭线程
}
}
当主线程执行打印主方法中的代码后,开启一个MyThread线程,MyThread线程会隔一秒打印"线程正在运行",此时主线程休眠五秒,之后调用MyThread线程的 interrupt() 方法结束线程。最后在catch块中打印“线程被中断”,这样线程就被成功关闭了。
关闭线程示例二:使用标志位终止线程
public class MyRunnableExample {
public static void main(String[] args) throws InterruptedException {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start(); //开始启动线程
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
myRunnable.stopRunning(); //设置标志位为false,关闭线程
}
}
该示例中首先创建一个 MyRunnable 对象并创建线程,在 MyRunnable 类的 run() 方法中使用 while 循环无限次运行,直到 isRunning 标志位变为 false。在主线程让它休眠 5 秒后,用 stopRunning() 方法将 isRunning 标志位置为 false,线程也就会自然终止了。
总的来说,本篇攻略详细介绍了 Java 线程的状态及切换,以及如何正确地关闭线程,分别使用 interrupt() 方法和标志位两种方式来示范。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java线程状态及切换、关闭线程的正确姿势分享 - Python技术站