java 并发线程应用

java 并发线程相关

线程状态

avatar

  • 新建(NEW): 创建后尚未启动。
  • 可运行(RUNABLE): 正在 Java 虚拟机中运行。但是在操作系统层面,它可能处于运行状态,也可能等待资源调度(例如处理器资源),资源调度完成就进入运行状态。所以该状态的可运行是指可以被运行,具体有没有运行要看底层操作系统的资源调度。
  • 阻塞(BLOCKED): 请求获取 monitor lock 从而进入 synchronized 函数或者代码块,但是其它线程已经占用了该 monitor lock,所以出于阻塞状态。要结束该状态进入从而 RUNABLE 需要其他线程释放 monitor lock。
  • 无限期等待(WAITING): 等待其它线程显式地唤醒。
    • 阻塞和等待的区别在于,阻塞是被动的,它是在等待获取 monitor lock。而等待是主动的,通过调用 Object.wait() 等方法进入。
进入方法退出方法
没有设置 Timeout 参数的 Object.wait() 方法Object.notify() / Object.notifyAll()
没有设置 Timeout 参数的 Thread.join() 方法被调用的线程执行完毕
LockSupport.park() 方法LockSupport.unpark(Thread)
  • 限期等待(TIMED_WAITING): 无需等待其它线程显式地唤醒,在一定时间之后会被系统自动唤醒。
    • 调用 Thread.sleep() 方法使线程进入限期等待状态时,常常用“使一个线程睡眠”进行描述。调用 Object.wait() 方法使线程进入限期等待或者无限期等待时,常常用“挂起一个线程”进行描述。睡眠和挂起是用来描述行为,而阻塞和等待用来描述状态。
进入方法退出方法
Thread.sleep() 方法时间结束
设置了 Timeout 参数的 Object.wait() 方法时间结束 / Object.notify() / Object.notifyAll()
设置了 Timeout 参数的 Thread.join() 方法时间结束 / 被调用的线程执行完毕
LockSupport.parkNanos() 方法LockSupport.unpark(Thread)
LockSupport.parkUntil() 方法LockSupport.unpark(Thread)
  • 死亡(TERMINATED): 可以是线程结束任务之后自己结束,或者产生了异常而结束。

线程方法与状态切换

sleep 导致当前线程休眠,与 wait 方法不同的是 sleep 不会释放当前占有的锁,sleep(long)会导致线程进入 TIMED-WATING 状态,而 wait()方法会导致当前线程进入 WATING 状态

wait 方法,主动让出锁。

  1. 不带时间常数的wait 方法进入WAITING状态。
  2. 带时间常数的wait 进入TIME-WAITING状态。

yield 方法,线程让步。 yield 会使当前线程让出 CPU 执行时间片,与其他线程一起重新竞争 CPU 时间片。一般情况下,优先级高的线程有更大的可能性成功竞争得到 CPU 时间片

join方法,当前线程转为阻塞状态,等到另一个线程结束,当前线程再由阻塞状态变为就绪状态,等待 cpu 的宠幸。

join方法可用于多线程的协作,如主子线程的协作,主线程等待子线程完成任务。
join 方法的状态转换与wait方法相同,带时间的进入TIME-WAITING状态,不带时间的进入WAITING状态。

System.out.println(Thread.currentThread().getName() + "线程运行开始!");
Thread6 thread1 = new Thread6();
thread1.setName("线程 B");
thread1.join();
System.out.println("这时 thread1 执行完毕之后才能执行主线程");

创建一个线程的开销

JVM 在背后帮我们做了哪些事情:

  1. 它为一个线程栈分配内存,该栈为每个线程方法调用保存一个栈帧
  2. 每一栈帧由一个局部变量数组、返回值、操作数堆栈和常量池组成
  3. 一些支持本机方法的 jvm 也会分配一个本机堆栈
  4. 每个线程获得一个程序计数器,告诉它当前处理器执行的指令是什么
  5. 系统创建一个与Java线程对应的本机线程
  6. 将与线程相关的描述符添加到JVM内部数据结构中
  7. 线程共享堆和方法区域

用数据来说明创建一个线程(即便不干什么)需要多大空间呢?
答案是大约 1M 左右。java -XX:+UnlockDiagnosticVMOptions -XX:NativeMemoryTracking=summary -XX:+PrintNMTStatistics -version
用 Java8 的测试结果,19个线程,预留和提交的大概都是19000+KB,平均每个线程大概需要 1M 左右的大小

avatar

创建线程的方式

  • callable 接口继承: 可以获取线程的返回值。

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

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

相关文章

【C++算法】堆相关经典算法题

1.最后一块石头的重量 其实就是一个模拟的过程:每次从石堆中拿出最大的元素以及次大的元素,然后将它们粉碎;如果还有剩余,就将剩余的石头继续放在原始的石堆里面重复上面的操作,直到石堆里面只剩下一个元素&#xff0c…

[C/C++] -- 装饰器模式

装饰器模式是一种结构型设计模式,它允许在不改变原始对象的基础上动态地扩展其功能。这种模式通过将对象包装在装饰器类的对象中来实现,每个装饰器对象都包含一个原始对象,并可以在调用原始对象的方法之前或之后执行一些额外的操作。 装饰器…

自学C语言能达到什么境界呢?

C 语言是一门广泛应用于系统软件、嵌入式系统、游戏开发等领域的编程语言。那么,通过自学 C 语言,能够达到什么样的境界呢? 就像学习小提琴一样,仅凭自学也可以达到一定的水平,能够自娱自乐,在亲友聚会时表…

Xed编辑器开发第一期:使用Rust从0到1写一个文本编辑器

这是一个使用Rust实现的轻量化文本编辑器。学过Rust的都知道,Rust 从入门到实践中间还隔着好几个Go语言的难度,因此,如果你也正在学习Rust,那么恭喜你,这个项目被你捡到了。本项目内容较多,大概会分三期左右陆续发布&a…

NAS导航面板Sun-Panel

什么是 Sun-Panel ? Sun-Panel 是一个服务器、NAS 导航面板、Homepage、浏览器首页。 软件主要特点: 🍉 界面简洁,功能强大,资源消耗低🍊 简单易用,可视化操作,零代码使用&#x1f…

python怎么安装matplotlib

1、登陆官方网址“https://pypi.org/project/matplotlib/#description”,下载安装包。 2、选择合适的安装包,下载下来。 3、将安装包放置到python交互命令窗口的当前目录下。 4、打开windows的命令行窗口,通过"pip install"这个命令…

新质生产力之工业互联网产业链

随着全球经济的数字化转型,新基建的概念逐渐成为推动工业发展的关键动力。在这一转型过程中,工业互联网作为新基建的核心组成部分,正逐渐塑造着未来工业的面貌。那么工业互联网产业链是如何构成的,以及它如何成为推动工业4.0和智能…

CRMEB开源打通版/标准版v4电商商城系统小程序发布之后无法生成海报问题

小程序产品分销二维码生成不了 开发者工具可以生成海报,但是发布之后无法生成 1.在开发者工具中,将不校验合法域名关闭 2.点击生成海报,查看console 3.将域名填写到微信公众平台小程序的download合法域名中 网址微信公众平台

react18【系列实用教程】memo —— 缓存组件 (2024最新版)

memo 的语法 如上图所示,在react中,当父组件重新渲染时,子组件也会重新渲染,即便子组件无任何变化,通过 memo 可以实现对组件的缓存,即当子组件无变化时,不再重新渲染子组件,核心代码…

【深度学习】Diffusion扩散模型的逆扩散问题

1、前言 上一篇,我们讲了Diffusion这个模型的原理推导。但在推导中,仍然遗留了一些问题。本文将解决那些问题 参考论文: ①Variational Diffusion Models (arxiv.org) ②Tutorial on Diffusion Models for Imaging and Vision (arxiv.org…

迭代的难题:敏捷团队每次都有未完成的工作,如何破解?

各位是否遇到过类似的情况:每次迭代结束后,团队都有未完成的任务,很少有完成迭代全部的工作,相反,总是将上期未完成的任务重新挪到本期计划会中,重新规划。敏捷的核心之一是“快速迭代,及时反馈…

ubuntu20.04 ROS 环境下使用速腾80线激光雷达

1.相关系统环境 系统版本:ubuntu 20.04 ROS版本:ROS1 - noetic 激光雷达型号:RoboSense Ruby (更新于2024.5.14) 2.网口配置: 将PC/工控机的网口配置为: ipv4,方式设置为手动 ip地址、掩码以…

基于springboot实现社区智慧养老监护管理平台系统项目【项目源码+论文说明】计算机毕业设计

基于SpringBoot实现社区智慧养老监护管理平台系统演示 摘要 如今社会上各行各业,都在用属于自己专用的软件来进行工作,互联网发展到这个时候,人们已经发现离不开了互联网。互联网的发展,离不开一些新的技术,而新技术的…

EE-SX670 槽型光电开关 5MM 限位检测感应器 使用案例

EE-SX670是一款槽型光电开关,也被称为U形传感器或限位检测感应器。它是光电传感器中的一种,通过检测物体是否插入其感应槽来触发开关。这种传感器通常用于自动化生产线上的位置检测、对象计数以及安全设备中的运动检测。 EE-SX670作为一款高性能的光电传…

谷歌外贸seo优化怎么做?

一般有两种选择,在大型电商平台开展业务,如亚马逊,阿里巴巴等平台,也可以选择搭建自己的独立站 选择在大型电商平台可以方便迅速建立起自己的商铺,不需要考虑太多交易,支付,物流等方面的问题&am…

MybatisPlus拓展功能(内附全功能代码)

目录 代码生成 静态工具 案例 逻辑删除 枚举处理器 ​编辑 Json处理器 分页插件功能 ​编辑 案例 封装转换方法 代码生成 静态工具 案例 Overridepublic UserVO queryUserAndAddressById(long id) { // 1.查询用户User user getById(id);if (user null || …

mobarxtem应用与华为设备端口绑定技术

交换机端口绑定 华为交换机的基础配置与MOBAXTERM终端连接 实验步骤: 一、给每个交换机划分vlan并添加端口 1.单个vlan的划分 2.批量划分vlan 在高端交换机CE6800上批量划分连续编号的VLAN,本例中连续的vlan20到vlan25 [~CE6800]vlan b 20 to 25 3…

什么是用户画像?用户画像的作用是什么?

首先我们来说下什么是用户画像? 用户画像是指对目标用户进行详细描述和分类的方法。 它是根据用户的个人特征、行为习惯、兴趣爱好、消费习惯等信息进行分析和总结,以便更好地了解用户需求和行为模式。用户画像可以帮助企业或组织更好地了解他们的目标…

论文阅读 - Anatomy of an AI-powered malicious social botnet

论文链接: https://arxiv.org/pdf/2307.16336.pdf 目录 摘要 1引言 2 相关工作 2.1 LLM驱动的网络威胁 2.2 LLM生成的内容检测 2.3 社交机器人检测 2.4 由 LLM 增强的机器人 3 Fox8僵尸网络的识别 4 特性 4.1 配置文件 4.2 社交网络 4.3内容类型 4.4放…