线程状态

王懿涛

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(无线等待) 线程状态图

阅读 177
4 声望
2 粉丝
0 条评论
你知道吗?

4 声望
2 粉丝
宣传栏