Java线程状态转换是指在Java多线程编程中,一个线程从一个状态转换到另一个状态的过程。Java中的多线程有五个基本的生命周期,分别是新建、就绪、运行、阻塞和死亡。在不同的生命周期中,一个Java多线程会从一个生命周期转换到另一个生命周期,这就是所谓的Java多线程的“生存”。
新建是指当我们使用new关键字实例化Thread对象时,该Thread对象就处于新建的生存期。此时,该Thread对象已准备好运行,但并不意味它会马上开始执行。
就绪是指当我们使用start()方法启动Thread对象时(即将其变成可运行态),该Thread对象就会进入就绪态。此时,该Thread对象已准备好开始执行了(但并不意味它会马上开始执行)。
运行是指当CPU开始执行Thread对象时(即将其变成运行态);此时该Thread对象正在CPU上执行代码。
阻塞是比如当一个Thread对象在执行代码时遇到了sleep()方法、wait()方法、join()方法或者synchronized关键字时都会发生阻塞。此时该Thread对象将不再占用CPU耗电量也很低。
public class ThreadState { public static void main(String[] args) { Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println("thread is running"); } }); // 打印出新建的thread的state System.out.println("thread state:" + thread.getState()); // 启动thread, 此时thread state应该变成RUNNABLE thread.start(); System.out.println("thread state:" + thread.getState()); } }
下面的代码演示了如何模拟Thread类中的stop(),suspend()和resume()方法。
public class Main extends Thread { private volatile boolean keepRunning = true; private boolean suspended = false; public synchronized void stopThread() { this.keepRunning = false; this.notify(); } public synchronized void suspendThread() { this.suspended = true; } public synchronized void resumeThread() { this.suspended = false; this.notify(); } public void run() { System.out.println("Thread started..."); while (keepRunning) { try { System.out.println("Going to sleep..."); Thread.sleep(1000); synchronized (this) { while (suspended) { System.out.println("Suspended..."); this.wait(); System.out.println("Resumed..."); } } } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) throws Exception { Main t = new Main(); t.start(); Thread.sleep(2000); t.suspendThread(); Thread.sleep(2000); t.resumeThread(); Thread.sleep(2000); t.stopThread(); } }
上面的代码生成以下结果。
JavaFX教程 -JavaFX路径JavaFX有其他内置的形状,如ArcCircleCubicCurveEllipseLinePathPolygonPolylineQuadCurveRectangleSVGPa...
JavaFX教程 -JavaFX属性JavaFX属性存储控件的内部状态,并允许我们监听来自JavaFX UI控件的状态更改。JavaFX属性可以彼此绑定。...
JavaFX教程 -JavaFX标签JavaFX API的javafx.scene.control包中的Label类显示一个文本元素。我们可以包装文本元素以适应特定空间...
Java日期时间 -Java年月日年年表示一年,例如2012年,2013年等。以下代码显示如何创建Year对象并对其执行基本操作。import java....