zoukankan      html  css  js  c++  java
  • Java并发编程的艺术(五)——线程和线程的状态

    线程

    什么是线程

    操作系统调度的最小单元就是线程,也叫轻量级进程。

    为什么要使用多线程

    1. 多线程程序能够更有效率地利用多处理器核心。
    2. 用户响应时间更快。
    3. 方便程序员将程序模型映射到Java提供的多线程编程模型上。

    线程的状态

    1. 初始态 NEW

    线程被构建,但是还没有调用start()方法调用。

    2 运行态 RUNNABLE

    运行态又分为就绪态和运行态:

    • 就绪态:该状态下线程已经具备执行所需要的所有资源,只等CPU分配执行权就能运行。所有的就绪态线程都排在就绪队列中。
    • 运行态:获取CPU执行权的正在执行的线程。每个CPU同时只有一条运行态的线程。

    3.阻塞态

    表示线程阻塞于锁。

    • 当线程请求一个资源失败的时候,就会进入阻塞态。Java中阻塞态就是指线程获取锁失败后进入的状态。是被动进入的。
    • 所有阻塞态的线程被排在阻塞队列当中。
    • 处于阻塞态的线程会不断请求资源,当请求成功的时候,就会又进入就绪队列等待执行。

    4.等待态

    • 当前线程中调用wait join park时,线程就会进入等待态。
    • 等待态的线程放在等待队列中。
    • 需要又其他线程的唤醒才行。
    • 会释放资源。

    5.超时等待态

    • 当线程中调用sleep wait join parkNanos parkUntil时,就是让线程进入等待态。
    • 与等待态不同,不是因为请求不到资源,这是主动进入的,需要其他线程对其进行唤醒。
    • 等待态的线程没有CPU执行权和占有资源。
    • 到了超时时间后进入阻塞队列,开始竞争锁。

    6.终止态

    线程执行结束后的状态。

    线程状态转换

    在这里插入图片描述

    • 初始态 ——> 就绪态
      当调用线程对象的start()方法就会进入就绪态。当就绪态队列中没有线程,那就直接进入运行态。
    • 就绪态 ——> 运行态
      由系统调度。
    • 运行态 ——> 就绪态
      调用Thread.yield()函数 或者 系统调度完成。
    • 运行态 ——> 阻塞态
      线程获取锁失败。
    • 阻塞态 ——> 就绪态
      获取到锁。
    • 运行态 ——> 等待态
      调用Object.wait() 方法,其调用必须是在同步块内部由同步块的锁对象调用。
      调用Thread.join() LockSupport.part() 方法。
    • 等待态 ——> 就绪态
      锁对象被调用了Object.notify() 方法,并且等待的线程不需要锁。
      还有Object.notifyAll() LockSupport.unpark(Tread) 方法。
    • 等待态 ——> 阻塞态
      锁对象 notify的时候,被等地啊线程还需要锁同步。

    知识点

    • wait方法会释放CPU的执行权和占有的锁。
    • sleep方法会释放CPU的使用权,但是任然占有锁;线程被放入超时等待队列,它会使线程较长时间得不到运行。
    • wait和notify必须配套使用,必须使用同一把锁。
    • wait和notify必须放在一个同步块中。
    • notify和notifyAll的区别在于,前者只唤醒等待队列中的一个线程,而后者是所有线程。

    Daemon 线程

    作用

    是一种支持型线程,主要用作程序中后台调度和支持性共工作。

    如果一个Java虚拟机中不存在非Deamon线程的时候,Java虚拟机就会退出,因为不会再有任务了呀。

    Java线程使用

    参考

  • 相关阅读:
    Linux Enterprise Cluster NOtes Ch4 同步:ssh和rsync
    e805上不安装中文外挂支持中文,很简单而且实用
    ARM的一些概念性问题
    C#调用WORD处理的小项目 转
    ASP.NET面试题
    .net清除cookie代码|.net为什么不能清除cookie|.net cookie 过期代码
    c#字符串转数字的函数|c#字符串转数字的无错函数|c#字符串转数字的最好函数
    Wiki简介
    new 和override 重写区别
    禁用IE的后退按钮|显示网页已过期|几种语言的实现方法|c#|javascript|html
  • 原文地址:https://www.cnblogs.com/lippon/p/14117669.html
Copyright © 2011-2022 走看看