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”);
php支持多线程吗发现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回收。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论