zoukankan      html  css  js  c++  java
  • 线程状态

    线程状态概述

    当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,

    有几种状态呢?在API中 java.lang.Thread.State 这个枚举中给出了六种线程状态:

    这里先列出各个线程状态发生的条件,下面将会对每种状态进行详细解析

    我们不需要去研究这几种状态的实现原理,我们只需知道在做线程操作中存在这样的状态。那我们怎么去理解这几 个状态呢,新建与被终止还是很容易理解的,我们就研究一下线程从Runnable(可运行)状态与非运行状态之间的转换问题。

    Timed Waiting(计时等待)

    Timed Waiting在API中的描述为:

      一个正在限时等待另一个线程执行一个(唤醒)动作的线程处于这一状态。

    在我们写卖票的案例中,为了减少线程执行太快,现象不明显等问题,我们在run方法中添加了sleep语句,这样就 强制当前正在执行的线程休眠(暂停执行),以“减慢线程”。

    其实当我们调用了sleep方法之后,当前执行的线程就进入到“休眠状态”,其实就是所谓的Timed Waiting(计时等待),那么我们通过一个案例加深对该状态的一个理解。

    实现一个计数器,计数到100,在每个数字之间暂停1秒,每隔10个数字输出一个字符串

    代码:

      

     1 public class SynDemo1 {
     2     public static void main(String[] args) {
     3         new MyThead().start();
     4     }
     5 }
     6 
     7 class MyThead extends Thread{
     8     @Override
     9     public void run() {
    10         for (int i = 0; i < 100; i++) {
    11             if ((i)%10 == 0){
    12                 System.out.println("-------"+i);
    13             }
    14             System.out.println(i);
    15             try{
    16                 Thread.sleep(1000);
    17                 System.out.print(" 线程睡眠1秒!
    ");
    18             }catch (InterruptedException e){
    19                 e.printStackTrace();
    20             }
    21         }
    22     }
    23 }

    通过案例可以发现,sleep方法的使用还是很简单的。我们需要记住下面几点:

      1. 进入 TIMED_WAITING 状态的一种常见情形是调用的 sleep 方法,单独的线程也可以调用,不一定非要有协 作关系。

      2.为了让其他线程有机会执行,可以将Thread.sleep()的调用放线程run()之内。这样才能保证该线程执行过程 中会睡眠。

      3、. sleep与锁无关,线程睡眠到期自动苏醒,并返回到Runnable(可运行)状态。

      注意:sleep()中指定的时间是线程不会运行的最短时间。因此,sleep()方法不能保证该线程睡眠到期后就开始立刻执行。

    Timed Waiting 线程状态图:

     BLOCKED(锁阻塞)

      Blocked状态在API中的介绍为:一个正在阻塞等待一个监视器锁(锁对象)的线程处于这一状态。

      我们已经学完同步机制,那么这个状态是非常好理解的了。比如,线程A与线程B代码中使用同一锁,如果线程A获 取到锁,线程A进入到Runnable状态,那么线程B就进入到Blocked锁阻塞状态。

      这是由Runnable状态进入Blocked状态。除此Waiting以及Time Waiting状态也会在某种情况下进入阻塞状态。

      Blocked 线程状态图:

      

     Waiting(无限等待)

      Wating状态在API中介绍为:一个正在无限期等待另一个线程执行一个特别的(唤醒)动作的线程处于这一状态。

      通过一段代码来演示下:

      代码:

      

      通过上述案例我们会发现,一个调用了某个对象的 Object.wait 方法的线程会等待另一个线程调用此对象的 Object.notify()方法 或 Object.notifyAll()方法。

      其实waiting状态并不是一个线程的操作,它体现的是多个线程间的通信,可以理解为多个线程之间的协作关系, 多个线程会争取锁,同时相互之间又存在协作关系。就好比在公司里你和你的同事们,你们可能存在晋升时的竞 争,但更多时候你们更多是一起合作以完成某些任务。  

      当多个线程协作时,比如A,B线程,如果A线程在Runnable(可运行)状态中调用了wait()方法那么A线程就进入 了Waiting(无限等待)状态,同时失去了同步锁。假如这个时候B线程获取到了同步锁,在运行状态中调用了 notify()方法,那么就会将无限等待的A线程唤醒。注意是唤醒,如果获取到锁对象,那么A线程唤醒后就进入 Runnable(可运行)状态;如果没有获取锁对象,那么就进入到Blocked(锁阻塞状态)。

     Waiting 线程状态图

      

    到此为止我们已经对线程状态有了基本的认识,想要有更多的了解,详情可以见下图:

  • 相关阅读:
    快速入门系列--MVC--07与HTML5移动开发的结合
    快速入门系列--WebAPI--01基础
    快速入门系列--CLR--02多线程
    MongoDB快速入门
    ubuntu 12.04 server编译安装nginx
    apache 正反向代理
    c# 继承,多态,new /overrid 区别, 引用父类的方法
    python 异步线程简单实现
    ubuntu上完全卸载package
    apache2:Invalid option to WSGI daemon process definition
  • 原文地址:https://www.cnblogs.com/cleanlife/p/14507233.html
Copyright © 2011-2022 走看看