Java 线程生命周期
2018-02-28 15:31 更新
Java线程教程 - Java线程生命周期
线程总是处于以下六种状态之一:
- New
- Runnable
- Blocked
- Waiting
- Timed-waiting
- Terminated
线程的所有这些状态都是JVM状态。
当一个线程被创建并且它的start()方法还没有被调用时,它处于新的状态。
Thread t = new MyThreadClass(); // t is in the new state
准备运行或运行的线程处于可运行状态。
如果线程尝试输入或重新输入同步的方法或块,但该监视器正在被另一个线程使用,则该线程处于阻塞状态。
状态转换
线程可以通过调用下表中列出的方法将自身置于等待状态。
方法 | 描述 |
---|---|
wait() | 从Object类。 |
join() | 从Thread类。 |
park() | 从java.util.concurrent.locks.LockSupport类。调用此方法的线程可以通过调用线程上的unpark()方法等待直到许可可用。 |
线程可以通过调用下表中列出的方法将自身置于等待等待状态。
描述 | 描述 |
---|---|
sleep() | 从Thread类。 |
wait (long millis) wait(long millis, int nanos) | 从Object类。 |
join(long millis) join(long millis, int nanos) | 从Thread类。 |
parkNanos (long nanos) parkNanos (Object blocker, long nanos) | 从LockSupport类,它在java.util.concurrent.locks包中。 |
parkUntil (long deadline) parkUntil (Object blocker, long nanos) | 从LockSupport类,它在java.util.concurrent.locks包中。 |
已完成其执行的线程处于终止状态。
终止的线程不能转换到任何其他状态。
例子
我们可以使用一个线程的isAlive()方法,在它已经启动后,知道它是否存活或终止。
我们可以使用Thread类中的getState()方法来随时获取线程的状态。
此方法返回Thread.State枚举类型的常量之一。
以下代码演示了线程从一个状态到另一个状态的转换。
class ThreadState extends Thread { private boolean keepRunning = true; private boolean wait = false; private Object syncObject = null; public ThreadState(Object syncObject) { this.syncObject = syncObject; } public void run() { while (keepRunning) { synchronized (syncObject) { if (wait) { try { syncObject.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } public void setKeepRunning(boolean keepRunning) { this.keepRunning = keepRunning; } public void setWait(boolean wait) { this.wait = wait; } } public class Main { public static void main(String[] args) throws InterruptedException { Object syncObject = new Object(); ThreadState ts = new ThreadState(syncObject); System.out.println("Before start()-ts.isAlive():" + ts.isAlive()); System.out.println("#1:" + ts.getState()); ts.start(); System.out.println("After start()-ts.isAlive():" + ts.isAlive()); System.out.println("#2:" + ts.getState()); ts.setWait(true); Thread.currentThread().sleep(100); synchronized (syncObject) { System.out.println("#3:" + ts.getState()); ts.setWait(false); syncObject.notifyAll(); } Thread.currentThread().sleep(2000); System.out.println("#4:" + ts.getState()); ts.setKeepRunning(false); Thread.currentThread().sleep(2000); System.out.println("#5:" + ts.getState()); System.out.println("At the end. ts.isAlive():" + ts.isAlive()); } }
上面的代码生成以下结果。
以上内容是否对您有帮助:
更多建议: