php100并发cpu告警,多线程并发导致CPU100%的一种原因和解决办法

在用自定义线程池的时候,遇到cpu100%,经过验证后,发现问题来源于我定义的子线程。

子线程的主要功能是从任务队列(LinkedBlockingQueue)里面持续拿出任务,并且执行。

以下为令CPU100的代码。

private class WorkThread extends Thread

{

@Override

public void run()

{

while(flag)

{

Runnable task=null;

if(flag&&!taskQueue.isEmpty())//当队列非空

{

try

{

task=taskQueue.poll();//拿到任务,若没有则拿到null

if(task!=null)

task.run();//执行任务

} catch (Exception e)

{

e.printStackTrace();

}

}

}

}

}

之后,随便往while循环里面添加进System.out.println(“xxxx”);

发现CPU降低了,不会升到100,于是我修改了代码如下:

//增加一句Thread.sleep(),令所有线程每次进入while循环的时候,都先休眠释放资源,这CPU就不会升到100

private class WorkThread extends Thread

{

@Override

public void run()

{

while(flag)

{

try {

Thread.sleep((long) 0.5);//先释放资源,避免cpu占用过高

} catch (Exception e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

Runnable task=null;

if(flag&&!taskQueue.isEmpty())//当队列非空

{

try

{

task=taskQueue.poll();//拿到任务,若没有则拿到null

if(task!=null)

task.run();//执行任务

} catch (Exception e)

{

e.printStackTrace();

}

}

}

}

}

造成上述现象的原因:LinkedBlockingQueue是线程安全,当多线程同步从队列里面取出任务,在微观时刻,有且只有一个线程能进入队列中取,因此其他线程阻塞等待,此时各线程都持有cpu资源,不释放,

就造成了大量cpu等待,因而CPU会升高;

值得注意的一点:

LinkedBlockingQueue中取出任务方法有几种,比如take(),poll(),一开始我用take方法,发现运行后,线程资源无法得到释放,后来看了api发现take()是阻塞拿,意思是:线程往队列里面拿任务,

如果队列里面没有任务,则进行等待知道有任务再次唤醒。

而poll()方法则是有任务就拿,没任务就返回null,因此不会出现阻塞等待,若上面代码改成用take方法,同样会出现cpu100的问题,也在于阻塞,同时也会出现线程不被GC回收。

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

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

相关文章

excel离散度图表怎么算_一般人不知道的几个excel制图技巧

原标题:一般人不知道的几个excel制图技巧作者:杜雨 公众号:数据小魔方(datamofang)今天这篇,我专注于Excel的作图规则,深入的研究下Excel由数据源到可视化图表之间的关系是如何对应的,倘若你已经在工作中横…

listview控件在php的使用方法,Android_Android编程之控件ListView使用方法,本文实例讲述了Android编程之控 - phpStudy...

Android编程之控件ListView使用方法本文实例讲述了Android编程之控件ListView使用方法。分享给大家供大家参考。具体分析如下:控件ListView是一个重要的控件,可以被用作用户列表等显示,下面进行它的操作测试。下面代码实现了生成了一个ListVi…

使用ElasticSearch进行近实时索引

选择索引策略很困难。 Elasticsearch 文档的确有一些一般性建议 ,并且有其他公司的 一些技巧 ,但这也取决于特定的用例。 在典型情况下,您有一个数据库作为事实的来源,并且有一个使事物可搜索的索引。 您可以采用以下策略&#xf…

air什么意思中文_Air 的中文意思是什么?

展开全部air释义:(1)作为名词,空气;32313133353236313431303231363533e59b9ee7ad9431333431366261天空;(飞行的)空中。(2)作为动词,晾;晾干;(使)通风;公开发表。读音:英[…

python xlutils函数,python3:xlrd、xlwt、xlutils处理excel文件

1.xlrd读取excel请参考上篇博客https://www.cnblogs.com/shapeL/p/9075843.html2.xlwt生成excel安装下载:pip install xlwt导入:import xlwt参考:生成excel文件test1.xlsfile_name ../dataconfig/test1.xlswbk xlwt.Workbook() #初始化work…

前端实现炫酷动效_20个网页动效设计的炫酷神器

如今很多 UI 设计师不是正在做动效,就正在学着做动效。动效现在已经无处不在了。有的动效可能是一个微妙的悬停效果,使用 Bttn.css 或者是 Hover Buttons 的帮助下,添加到按钮上,有的则可能是使用引人瞩目的动态渐变背景抓住用户的…

php7设置最大连接数,sybase 15.7 修改 number of user connections 最大连接数

sp_configure number of user connectionssp_configure number of user connections,200修改Sybase最大连接数的方法有两种,如下:一、 进Sybase central, 鼠标右键选择数据库服务器(要处理的服务器),然后选择右键菜单中的配置选项&#xff0c…

jsr303 自定义消息_JSR 303从I18N属性文件加载消息

jsr303 自定义消息总览 本文将说明如何适应JSR 303验证API来从I18n属性文件加载消息,并通过保留国际化的所有好处和对多种语言的支持来实现这一点。 为此,我们将实现一个基于Spring API的自定义MessageInterpolator,用于管理I18N消息。 依存…

最优隐神经元数目 算法 matlab,BP算法的改进在Matlab的实现研究

BP 算法的改进在M a tlab 的实现研究姚文俊(中南民族大学电子信息工程学院 湖北武汉 430074)摘 要:利用M atlab 中的神经网络工具箱提供的丰富网络学习和训练函数,对BP 网络和BP 算法的优化方案进行仿真,得到较优的BP 算法。关键词:人工神经网络;BP 网络;M atlab ;N eu ral …

php 导出excel分段导出_PHP 导出excel 数据量大时

public functionceshiexcel1(){set_time_limit(0);$filename 病毒日志;header(Content-Type: application/vnd.ms-excel);header(Content-Disposition: attachment;filename".$filename..csv");header(Cache-Control: max-age0);//原生链接mysql//数据库配置$mysql_…

通过Apache Kafka集成流式传输大数据

从实时实时过滤和处理大量数据,到将日志数据和度量数据记录到不同来源的集中处理程序中,Apache Kafka日益集成到各种系统和解决方案中。 使用CData Sync ,可以轻松地将此类解决方案应用于任何CRM,ERP或Analytics软件。 配置Apach…

php7 获取数据流,stream_socket_accept()

stream_socket_accept()(PHP 5, PHP 7)接受由stream_socket_server()创建的套接字连接说明stream_socket_accept(resource$server_socket[,float$timeout ini_get("default_socket_timeout")[,string&$peername]]):resource接受由stream_socket_server()创建的套…

浪潮as5300技术方案_浪潮智能存储AS5300G2双活解决方案

智慧医疗已成为提高就医效率、减少医疗差错的有效科技手段。江西省泰和中医院通过采用浪潮智能存储AS5300G2双活解决方案,构筑了一个满足医院数字化、信息化、智能化、可持续发展的信息支撑系统平台,使业务数据有保障、资源调配共享更高效、运维管理更方…

安卓php推送消息机制,深入剖析Android消息机制原理

在Android中,线程内部或者线程之间进行信息交互时经常会使用消息,这些基础的东西如果我们熟悉其内部的原理,将会使我们容易、更好地架构系统,避免一些低级的错误。在学习Android中消息机制之前,我们先了解与消息有关的…

python单元测试mock_Mock 在 Python 单元测试中的使用

本文讲述的是 Python 中 Mock 的使用。如何执行单元测试而不用考验你的耐心很多时候,我们编写的软件会直接与那些被标记为“垃圾”的服务交互。用外行人的话说:服务对我们的应用程序很重要,但是我们想要的是交互,而不是那些不想要…

php bin2hex(),PHP bin2hex() 函数 pack() 函数

bin2hex() 函数bin2hex() 函数把 ASCII 字符的字符串转换为十六进制值。字符串可通过使用 pack() 函数再转换回去。语法bin2hex(string)string必需。要转换的字符串。示例一把 "Shanghai" 转换为十六进制值$str bin2hex("Shanghai");echo($str); // 53686…

java 泛型示例_使用Java泛型的模板方法模式示例

java 泛型示例如果您发现除了某些部分外,您的许多例程完全相同,那么您可能需要考虑使用Template Method来消除容易出错的代码重复 。 这是一个示例:下面是两个做类似事情的类: 实例化并初始化Reader以从CSV文件读取。 阅读每一行…

vue如何使浏览器url固定_怎么给 vue的 vue-router url地址最后加上 / 斜杠

这样没用 - -应该需要怎么加?router.beforeEach((to, from, next) > {if (!checkJs.getCookie(token) && to.path ! / && to.path ! /resetpassword) {next(/);} else if (checkJs.getCookie(token) && from.path /login || checkJs.ge…

oracle dbstart,dbstart: 未找到命令

oracle 12c在centos最小化下安装后,数据库不随机启动,按照网上的教程,编辑了/etc/oratab文件增加了rc.local文件结果还是不随机启动,通过:systemctl status rc-local.service可以看到服务启动失败,提示如标…

确定Java等价性的新时代?

几个月前,我读了一篇题为“确定Java等价性的新时代?”的博客文章。 这在某种程度上与我当时在我那令人脚的副项目Java :: Geci中开发的内容非常吻合 。 我建议您暂停阅读,阅读原始文章,然后再返回此处,即使您知道一定比…