1.线程状态概述

线程有以下6种状态:NEW(新建)、Runnable(可运行)、Blocked(锁阻塞)、Waiting(有限期待)、TimedWaiting(计时期待)、Teminated(被终止)。


2.Timed Waiting(计时期待)

同waiting状态,有几个办法有超时参数,调用他们将进入Timed Waiting状态。这一状态将始终放弃到超时期满或者接管到唤醒告诉。带有超时参数的罕用办法有Thread.sleep 、Object.wait.

public class MyThread extends Thread {  public void run() {    for (int i = 0; i < 10; i++) {      if ((i) % 10 == 0) {          System.out.println("‐‐‐‐‐‐‐" + i);      }      System.out.print(i);      try {        Thread.sleep(1000);        System.out.print(" 陈丽好!\n");      } catch (InterruptedException e) {          e.printStackTrace();      }    }  }  public static void main(String[] args) {      new MyThread().start();  }}

这些代码就会像计时器,在每个数字之间暂停一秒输入一个陈丽好。


2.BLOCKED(锁阻塞)

当一个线程试图获取一个对象锁,而该对象锁被其余的线程持有,则该线程进入Blocked状态;当该线程持有锁时,该线程将变成Runnable状态。


3.Waiting(有限期待)

一个线程在期待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态。进入这个状态后是不能主动唤醒的,必须期待另一个线程调用notify或者notifyAll办法才可能唤醒。

package com.kjzz;public class Demo10 {    public static Object a = new Object();    public static void main(String[] args) {        new Thread(new Runnable() {            @Override            public void run() {                while (true){                    synchronized (a){                            try {                                System.out.println(Thread.currentThread().getName() + "=== 获取到锁对象,调用wait办法,进入waiting状态,开释锁对象");                                a.wait();                            }catch (InterruptedException e){                                e.printStackTrace();                            }                        System.out.println(Thread.currentThread().getName() + "=== 从waiting状态醒来,获取到锁对象,继续执行了");                    }                }            }        },"期待线程").start();        new Thread(new Runnable() {            @Override            public void run() {                try {                    System.out.println(Thread.currentThread().getName() +"------ 期待5秒钟");                    Thread.sleep(5000);                }catch (InterruptedException e){                    e.printStackTrace();                }                synchronized (a){                    System.out.println(Thread.currentThread().getName() + " ----- 获取到锁对象,调用notify办法,开释锁对象");                    a.notify();                }            }        },"唤醒线程").start();    }}

这些代码运行后期待五秒,会唤醒线程。


Waiting(无线期待) 线程状态图