Java并发编程:Thread类的使用

个人总结:参考:博客园-海子-http://www.cnblogs.com/dolphin0520/p/3920357.html

     参考:https://blog.csdn.net/sinat_36042530/article/details/52565296

1、线程的状态:

  创建(new)  ->  就绪(runnable)          ->运行(running)->阻塞(blocked)
  (分配资源)   (等待获取cpu时间片)                                  ->消亡(dead)
2、线程状态的转换:
  2.1:线程的阻塞状态 :
     1)调用sleep()进入睡眠状态
     2)调用wait()将线程挂起
     3)任务在等待某个输入输出的完成
     4)任务试图在某个对象上调用其同步控制方法。但是对象锁不可用。因为另外一个任务已经获得这个锁 (如等待获取锁)
     3)、4)两种情形interrupt方法将不会被中断
  2.2当线程Thread处在running状态时:
    (1):调用某个对象的wait()方法:这是继承自Object中的方法,当前线程释放锁,重新进入线程池等待,只有调用notify(),notifyAll()唤醒该线程,该线程才会就绪队列排队等待分配资源(进入锁池竞争锁)。
    (2):sleep方法是线程的,即交出当前的cpu时间片,但不会释放锁,时间到达后,也不一定会立即执行(如未获取时间片),且必须捕获InterruptedException异常或向上抛出。
    (3):yield方法,相当于sleep方法,交时间片不交锁,区别在于无法控制交出的时间。
    (4):join方法,thread.join():当前线程等待thread线程完成;thread.join(long m,(int nanoseconds)):当前线程等待thread线程执行m时间;
    (5):interrupt方法:只能中断1,2中的阻塞状态,使线程抛出异常,结束。而且不行中断只在running的线程(可以通过设定标志位flag结束)。
    (6):getId(),getName();
    (7):setDaemon和isDaemon设置守护线程,守护线程依赖于创建它的线程,而用户线程则不依赖。如垃圾收集器就是守护线程。

    wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。

如图:五种状态之间的转换;

更详细请移步:博客园-海子-http://www.cnblogs.com/dolphin0520/p/3920357.html

3、对象的锁池与等待池:

  (注:锁池与等待池是部分中文翻译造成的,实际还是对象内的唯一的内部锁Monitor)
  1、每一个java对象都有一个唯一与之对应的内部锁(Monitor)。
  2、线程Thread调用的wait()和notify()方法实际是继承自基层类Object的。
  3、JVM为每一个对象维护两个“队列”:Entry Set(入口集)和Wait Set(等待集)
   Entry Set(入口集):维护等待获取对象内部锁的所有线程;Wait Set维护执行了object.wait()、object.wait(long)的方法。
   Wait Set(等待集):维护所有执行了wait()或者wait(long time)的线程。
  4、状态转换的具体:
    一个对象objectX的内部锁为MonitorX,现在有线程A,B,C同时申请monitorX,假设B申请成功,那么A,C进入Blocked状态,进入obiectX的Entry Set当中;当线程B释放掉monitorX后,Entry Set中的任意一个线程(可能不是等待时间最长的)被唤醒进入Runnable状态,与其他活跃Runnable线程竞争锁,如果成功,则移出Entry Set,否则继续留在Entry Set中。
    如果一个线执行了objectX.wait(),那么该线程会被暂停(waiting),进入Wait Set中。当其他线程执行了notify或者notifyAll方法,Wait Set中的一个或多个线程被唤醒(Runnable),进入Entry Set,与处于Entry Set中的线程以及其他Runnable的线程争夺对象锁。若一个线程申请锁成功,该线程从wait Set中移出,否则仍然停留在waitSet中,Blocked,等待下次申请锁的机会。
  注意;notify()和notifyAll()方法只是唤醒等待该对象的monitor的线程,并不决定哪个线程能够获取到monitor。

Java并发机制(1)--线程状态与方法(转)的更多相关文章

  1. Java并发机制(7)--线程池ThreadPoolExecutor的使用

    Java并发编程:线程池的使用整理自:博客园-海子-http://www.cnblogs.com/dolphin0520/p/3932921.html 1.什么是线程池,为什么要使用线程池: 1.1. ...

  2. 《Java并发编程的艺术》Java并发机制的底层实现原理(二)

    Java并发机制的底层实现原理 1.volatile volatile相当于轻量级的synchronized,在并发编程中保证数据的可见性,使用 valotile 修饰的变量,其内存模型会增加一个 L ...

  3. 【java并发编程艺术学习】(三)第二章 java并发机制的底层实现原理 学习记录(一) volatile

    章节介绍 这一章节主要学习java并发机制的底层实现原理.主要学习volatile.synchronized和原子操作的实现原理.Java中的大部分容器和框架都依赖于此. Java代码 ==经过编译= ...

  4. Java 并发系列之二:java 并发机制的底层实现原理

    1. 处理器实现原子操作 2. volatile /** 补充: 主要作用:内存可见性,是变量在多个线程中可见,修饰变量,解决一写多读的问题. 轻量级的synchronized,不会造成阻塞.性能比s ...

  5. Java 并发机制底层实现 —— volatile 原理、synchronize 锁优化机制

    本书部分摘自<Java 并发编程的艺术> 概述 相信大家都很熟悉如何使用 Java 编写处理并发的代码,也知道 Java 代码在编译后变成 Class 字节码,字节码被类加载器加载到 JV ...

  6. 《Java并发编程的艺术》读书笔记:二、Java并发机制的底层实现原理

    二.Java并发机制底层实现原理 这里是我的<Java并发编程的艺术>读书笔记的第二篇,对前文有兴趣的朋友可以去这里看第一篇:一.并发编程的目的与挑战 有兴趣讨论的朋友可以给我留言! 1. ...

  7. Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  8. Java并发编程:线程池的使用(转)

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  9. Java并发编程:线程控制

    在上一篇文章中(Java并发编程:线程的基本状态)我们介绍了线程状态的 5 种基本状态以及线程的声明周期.这篇文章将深入讲解Java如何对线程进行状态控制,比如:如何将一个线程从一个状态转到另一个状态 ...

  10. Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)

    Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...

随机推荐

  1. 大数据分析用自助式BI工具就能轻松解决,so easy!

    之前老板给了我一个任务,让我赶紧学习一下大数据分析,下个季度就要用. 赶紧看了一下日历,这离下个季度还有不到半个月的时间,而且我还没有数据分析基础,该怎么能在这么短的时间内学会大数据分析呢-- 经过多 ...

  2. 2021年国内外五大BI厂商_商业智能工具推荐

    ​每家公司对于BI工具的使用都有自己的特点和期望,所以当面对国内外那么多的BI厂商时,大家可能会觉得难以选择.今天我将会为大家介绍国内外五大BI厂商,对于它们做出一些分析,让大家更了解这些BI厂商. ...

  3. nmtui解决network-scripts目录下无网卡对应配置文件问题

    1.问题出现的原因设备先安装了操作系统,后插上网卡到设备,就会出现/etc/sysconfig/network-scripts目录下无该网卡对应配置文件的问题,但是ifconfig命令能看见系统给该网 ...

  4. JZ-063-数据流中的中位数

    数据流中的中位数 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两 ...

  5. LeetCode-062-不同路径

    不同路径 题目描述:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 "Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下 ...

  6. sql 名词解析

    针对这个 sql 语句进行解析 1 SELECT 2 a.* 3 , b.L12_create_time L1第一次转L2的时间 4 , ROUND(c.L1_pending/60, 2) " ...

  7. 国产化之Arm64 CPU+银河麒麟系统安装.NetCore

    背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟,银河麒麟就是一个Linux发行版,数据库使用达梦V8,这个数据库很多概念和Oracle相似,CPU平台的范围:龙芯.飞腾.鲲鹏等. ...

  8. 矩池云安装gdal五种解决方案

    1.最快最靠谱的是conda conda install gdal 命令行conda/pip search gdal查看版本,选择合适的版本,例如:conda search gdal 命令行conda ...

  9. MariaDB 与Mysql版本对应关系

    特定MariaDB版本的完全兼容性 就InnoDB而言,MariaDB 10.2.MariaDB 10.3和MariaDB 10.4是MySQL 5.7的有限替代.然而,在每一个新的MariaDB版本 ...

  10. 构造方法__construct()与析构方法__destruct() 构造方法:刚出生时婴儿的啼哭 析构方法:老人临终时的遗言

    <?phpclass person{ var $name; var $sex; var $age;//构造方法 function __construct($name, $sex, $age) { ...