Java多线程系列(二):线程的五大状态,以及线程之间的通信与协作

在Java面试的时候,经常会问到Java并发编程相关的多线程、线程池、线程锁、线程通信等面试必考点,比如:

Java并发编程系列:Java线程池的使用方式,核心运行原理、以及注意事项

Java并发编程系列:4种常用Java线程锁的特点,性能比较、使用场景

Java并发编程系列:CountDownLatch、Semaphore等4大并发工具类详解

高并发编程系列:ConcurrentHashMap的实现原理(JDK1.7和JDK1.8) 

史上最强多线程面试44题和答案:线程锁+线程池+线程同步等

今天主要分享多线程状态流转与通信,这也是面试中必考的基础知识点。


多线程的基本概念

1.进程

进程是操作系统进行资源分配和调度的基本单位。


2.线程

线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。

3.多线程

什么是多线程呢?即就是一个程序中有多个线程在同时执行。


线程的生命周期

Java多线程系列(二):线程的五大状态,以及线程之间的通信与协作


java中每个线程都需经历新生、就绪、运行、阻塞和死亡五种状态,线程从新生到死亡的状态变化称为生命周期。


1.新建状态

使用 new Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。

2.就绪状态

调用了start()方法之后,该线程就进入就绪状态(就绪队列中),等待JVM里线程调度器的调度。

3.运行状态

执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。

4.阻塞状态

如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。

5.死亡状态

一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。

线程的调度策略

线程调度是指系统为线程分配处理器使用权的过程。

Java 使用的线程调度是抢占式调度,在抢占式调度下,优先级最高的任务一直执行,直到它进入等待或死亡状态或更高优先级的任务出现,优先级高的线程比优先级低的线程优先执行。

在Java多线程环境中,为保证所有线程的执行能按照一定的规则执行,JVM实现了一个线程调度器,它定义了线程调度的策略。 在 JVM 中体现为让可运行池中优先级高的线程拥有CPU 使用权。

线程之间的通信与协作



Java多线程系列(二):线程的五大状态,以及线程之间的通信与协作

上面比较清楚的显示了线程的状态流转,其实重点主要是掌握运行、阻塞、就绪之间的通信机制。

1.sleep()和yield()和join()


1)sleep()方法作用:让当前线程睡眠一段时间,期间不会释放任何持有的锁。

2) yield()方法作用:让出该线程的时间片给其它线程。线程调用了yield()方法,表示放弃当前获得的CPU时间片,回到就绪状态。最后由线程调度重新选择就绪状态的线程分配CPU资源。

3)join()方法作用:暂停当前线程,等待被调用线程指向结束之后再继续执行。

注意:

1)sleep(long)方法仅释放CPU使用权,锁仍然占用。

2)调用join()的时候,当前线程不会释放掉锁。

2.wait()和notify() 方法和notifyAll()方法

1)wait()方法的作用:让该线程处于等待状态。

2)notify()方法的作用:唤醒处于wait的线程。

3)notifyAll()方法的作用:唤醒所有处于wait状态的线程。

注意:

1)wait()方法会释放CPU执行权 和 占有的锁。

2) 线程调用wait()方法后,让该线程处于等待状态。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒。wait和notify必须配套使用,即必须使用同一把锁调用。


money.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480108.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

负样本为王:评Facebook的向量召回算法

星标/置顶小屋,带你解锁最萌最前沿的NLP、搜索与推荐技术有人的地方就会有江湖,就会有鄙视链存在,推荐系统中也不例外。排序、召回,尽管只是革命分工不同,但是我感觉待遇还是相差蛮大的排序排序,特别是精排…

论文浅尝 | TEQUILA: 一种面向时间信息的知识问答方法

来源:CIKM’18链接:http://delivery.acm.org/10.1145/3270000/3269247/p1807-jia.pdf?ip223.3.116.39&id3269247&accACTIVE%20SERVICE&keyBF85BBA5741FDC6E%2EEEBE655830483280%2E4D4702B0C3E38B35%2E4D4702B0C3E38B35&__acm__15478819…

京东2020算法工程师0824笔试题整理

代码题: 1:开心消消乐: #include #include #include #include #include #include #include #define ll long long #define inf 0x3f3f3f3f #define Max 1001 using namespace std; int dir[4][2]{{-1,0},{1,0},{0,-1},{0,1}}; string …

论文笔记(eTrust: Understanding Trust Evolution in an Online World)

eTrust:理解线上信任进化 原文链接:eTrust: Understanding Trust Evolution in an Online World, KDD’12 原理:用户偏好与项的向量内积 用户与朋友相似度权重*朋友对项的时间衰减评分用户对项的评分 摘要 大部分关于线上信任的研究都假设…

技术动态 | 67 亿美金搞个图,创建知识图谱的成本有多高你知道吗?

OpenKG 祝各位读者元宵节快乐!本文转载自公众号:机器之心。选自ISWC作者:Baptiste Rocca参与:思源、李亚洲我们知道强大的深度模型需要很多计算力,那你知道创建一个知识图谱的成本到底是多少吗?德国 Mannhe…

Attention模型:我的注意力跟你们人类不一样

星标/置顶小屋,带你解锁最萌最前沿的NLP、搜索与推荐技术文 | 小轶背景截至今日,Badanau Attention的原文citation已达1.34w之多。2020年几乎所有主流NLP任务都需要借助attetion来实现。在深度学习全民炼丹的时代,attention是为数不多具有较强…

动态规划算法(Dynamic Programming)之0-1背包问题

文章目录1. 问题引入2. 动态规划求解0-1背包3. 复杂度4. 0-1背包升级版(带价值)5. 0-1背包升级版(带价值)DP解法1. 问题引入 前面讲了0-1背包的回溯解决方法,它是穷举所有可能,复杂度是指数级别的&#xf…

Java多线程系列(一):最全面的Java多线程学习概述

Java并发编程的技能基本涵括以下5方面: 多线程 线程池 线程锁 并发工具类 并发容器 多线程的4种创建方式 继承Thread 实现Runnable接口 实现Callable接口 以及线程池来创建线程 Java线程的生命周期 线程的创建 线程的就绪 线程的运行 线程的阻塞 线程的死…

论文浅尝 | 基于知识库的自然语言理解 01#

本文转载自公众号:知识工场。罗康琦,上海交通大学计算机系2019届博士,研究方向为自然语义理解和知识图谱。2012年获得华中科技大学软件工程学士学位,现就职于京东数据科学实验室(Data Science Lab)。他曾在…

推荐系统图算法实用干货汇总(含论文、代码、样例教程)

Hello,今天为朋友们推荐一个值得学习的公众号「浅梦的学习笔记」,小编目前在电商公司从事推荐系统相关的工作。主要分享关于「推荐系统,图算法,NLP&CV以及求职面试」等内容,欢迎关注一起学习和交流~文末可打包下载…

动态规划应用--双11购物凑单

文章目录1. 问题描述2. 代码实现1. 问题描述 双11购物节的时候,某宝给你很多张满300减50的优惠券,你想组合各种商品的价格总和>300,且金额总和越接近300越好,这样可以多薅点羊毛。 回溯算法效率太低,时间复杂度指…

商汤科技2020数据分析师0820笔试题目整理

2019年8月19日 问答题1:缺失值数据预处理有哪些方法?https://juejin.im/post/5b5c4e6c6fb9a04f90791e0c 处理缺失值的方法如下:删除记录,数据填补和不处理。主要以数据填补为主。 1 删除记录:该种方法在样本数据量十分…

Java多线程系列(八):ConcurrentHashMap的实现原理(JDK1.7和JDK1.8)

HashMap、CurrentHashMap 的实现原理基本都是BAT面试必考内容,阿里P8架构师谈:深入探讨HashMap的底层结构、原理、扩容机制深入谈过hashmap的实现原理以及在JDK 1.8的实现区别,今天主要谈CurrentHashMap的实现原理,以及在JDK1.7和…

论文笔记(Neural Graph Collaborative Filtering)

神经图协同过滤 论文链接:Neural Graph Collaborative Filtering, SIGIR’19 原理:在 user-item interaction graph 上使用 GNN 来学习 user 向量和item 向量,用户向量和项向量的内积来预测评分。 区别: 大部分论文使用 GNN 只是…

论文浅尝 | 基于知识库的自然语言理解 02#

本文转载自公众号:知识工场。罗康琦,上海交通大学计算机系2019届博士,研究方向为自然语义理解和知识图谱。2012年获得华中科技大学软件工程学士学位,现就职于京东数据科学实验室(Data Science Lab)。他曾在…

工业解密:百度地图背后的路线时长预估模型!

星标/置顶小屋,带你解锁最萌最前沿的NLP、搜索与推荐技术编 | YY无论你是苦逼学生(公交地铁狗)、职场萌新(打车狗)还是有钱大佬(有车一族),只要站在了北上广深的土地上,就…

动态规划应用--“杨辉三角”最短路径 LeetCode 120

文章目录1. 问题描述2. DP算法代码3. LeetCode 120 三角形最小路径和1. 问题描述 对“杨辉三角"进行一些改造。每个位置的数字可以随意填写,经过某个数字只能到达下面一层相邻的两个数字。 假设你站在第一层,往下移动,我们把移动到最底…

Java多线程系列(九):CountDownLatch、Semaphore等4大并发工具类详解

之前谈过高并发编程系列:4种常用Java线程锁的特点,性能比较、使用场景 ,以及高并发编程系列:ConcurrentHashMap的实现原理(JDK1.7和JDK1.8) 今天主要介绍concurrent包的内容以及4大并发工具类。 Java并发工具包 1.并发工具类 …

快手 算法工程师 0825 笔试题

4 求解一元一次方程的解 #include <cstdio> #include <iostream> #include <string.h> #include <cstring> #include <algorithm> using namespace std; int x0,n0,xr0,nr0; int flag 0; void Adds(string a,char op) { if(flag0) {if(a…

论文笔记(Neural Collaborative Filtering)

神经协同过滤 论文链接&#xff1a;Neural Collaborative Filtering, WWW’17 原理&#xff1a;融合 GMF 和 MLP 1. 摘要 虽然最近的一些研究使用深度学习作为推荐&#xff0c;但他们主要是用深度学习来建模辅助信息&#xff0c;例如 item 的文本描述。在表示协同过滤的关键…