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. 已经安装的nginx增加额外配置步骤

    这里以安装第三方ngx_http_google_filter_module模块为例nginx的模块是需要重新编译nginx,而不是像apache一样配置文件引用.so1. 下载第三方扩展模块ngx_h ...

  2. ctf.show-misc31

    (感谢阿姨)这个misc还是属于比较阴间的,并且学到了一个新的编码形式,直接开搞 下载附件得到压缩包,解压需要密码,可以看到没有输入密码解压也是得到了一个"file"文件,以txt ...

  3. oj教程--深度优先DFS

    深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法.

  4. numpy最后一部分及pandas初识

    今日内容概要 numpy剩余的知识点 pandas模块 今日内容详细 二元函数 加 add 减 sub 乘 mul 除 div 平方 power 数学统计方法 sum 求和 cumsum 累计求和 m ...

  5. 反压缩 js ,我的万花筒写轮眼开了,CV 能力大幅提升

    前言 因为比较菜,所以经常需要读一些别人的代码学习学习. 有源码的代码当然好,但是很多网站不开源.这些网站的 js 又都是打包压缩过的,学习起来很难受. 所以我做了一个小工具,通过修改抽象语法树,来处 ...

  6. 超好用的Markdown编辑器Typora中的常见语法

    目录 下载网址 安装 一.标题 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 二.语法环境 三.单选 四.字体 五.分割符 六.列表 七.图片引入 八.表格 九.超链接 下载网址 正版中 ...

  7. 【Azure API 管理】使用APIM进行XML内容读取时遇见的诡异错误 Expression evaluation failed. Object reference not set to an instance of an object.

    问题描述 使用APIM,在 Inbound 中对请求的Body内容进行解析.客户端请求所传递的Request Body为XML格式,需要从Request Body中解析出多个(Element)节点值, ...

  8. JZ-011-二进制中 1 的个数

    二进制中 1 的个数 题目描述 输入一个整数,输出该数32位二进制表示中1的个数.其中负数用补码表示. 题目链接: 二进制中 1 的个数 代码 /** * 标题:二进制中 1 的个数 * 题目描述 * ...

  9. TCC分布式事框架务详解

    之前网上看到很多写分布式事务的文章,不过大多都是将分布式事务各种技术方案简单介绍一下.很多朋友看了还是不知道分布式事务到底怎么回事,在项目里到底如何使用. 所以这篇文章,就用大白话+手工绘图,并结合一 ...

  10. 原生JS添加事件方法

    事件 事件添加方式 EvenTarget.addEventListener(EvenName, functionName, option); EventName: example => clic ...