线程都类似这种情况,还有存在通过webservice去连接其他计算机服务器,判断服务器是否存在。
webservice也是非常耗资源的。
代码由于是20秒执行一次主线程,主线程里面的while并不是一直循环的。
public void run() {
Thread.currentThread().setPriority(2);
//logger.debug("----------------------------");
if (isPause)
return;
//logger.debug("after pause------------------------");
counter++;
// if (logger.isDebugEnabled())
// {
// logger.debug("开始检测设备状态");
// }
if (executors == null) {
executors = new ThreadPoolExecutor(20, 20, 0L,
TimeUnit.MILLISECONDS,
new DefaultedOfferTimeoutBlockingQueue<Runnable>(5, 86400,
TimeUnit.SECONDS));
}
//logger.debug("after executors ----------------------------");
if (taskExecutors == null) {
int threadCount = 100;
//logger.debug("begin try ----------------------------");
try {
String s = Utils.getPropertyValue("MonitorThreadCount");
logger.debug("获取状态监控线程数量:"+s);
System.out.println("s="+s);
threadCount = Integer.valueOf(s);
} catch (Exception e) {
logger.error("获取状态监控线程数量出现错误", e);
//logger.debug("catch ---"+e.getMessage());
}
taskExecutors = new ThreadPoolExecutor(threadCount, threadCount,
0L, TimeUnit.MILLISECONDS,
new DefaultedOfferTimeoutBlockingQueue<Runnable>(5, 86400,
TimeUnit.SECONDS));
}
// long beginTime = System.currentTimeMillis();
// int counter = 0;
DeviceIterator it;
//logger.debug("DeviceIterarate------------------------");
try {
it = new DeviceIterator();
//logger.debug("device------------------------");
// System.out.println("共有 " + it.getTotalCount() + " 个");
while (it.hasMorePages()) {
/**
* 为每一页创建一个任务,并从executors中分配一个线程处理该任务
*/
// System.out.println("page " + counter);
//logger.debug("get Device");
executors.execute(new Task(it.next()));
// counter ++;
}
// logger.debug("检测设备状态分配任务完成");
// logger.debug("分配任务花费时间:" + (System.currentTimeMillis() - beginTime));
// System.out.println("创建 " + counter + " 个Task," +
// (System.currentTimeMillis() - beginTime));
} catch (Exception e) {
logger.error("创建DeviceIterator出现异常", e);
}
it = null;
}
这个是启动上面的线程的,根据服务器开始时就启动。
package cn.jos.ems.service.monitor;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import cn.jos.ems.service.IService;
import cn.jos.ems.service.LaunchException;
/**
* 监控服务抽象类。
*
* 将监控服务的通用方法抽象出来。
*
*/
public abstract class AbstractMonitorService implements IService, Runnable {
// private ExecutorService executors;
private ScheduledExecutorService scheduled;
@SuppressWarnings("unchecked")
protected ScheduledFuture future;
protected int state;
public int getState()
{
return state;
}
public void startup() throws LaunchException
{
scheduled = Executors.newSingleThreadScheduledExecutor();
// 如果使用scheduleAtFixedRate方法可能会出现上一次任务还没有执行完就启动了下一次任务
future = scheduled.scheduleWithFixedDelay(this, 0, getInterval(), TimeUnit.SECONDS);
state = RUNNING;
}
public void shutdown()
{
destroy();
future.cancel(true);
scheduled.shutdown();
state = STOP;
}
public void restart() throws LaunchException
{
shutdown();
startup();
}
/**
* 关闭服务时调用,主要目的是释放资源
*/
public abstract void destroy();
/**
* 获取监控任务执行间隔
* @return
*/
public abstract long getInterval();
/**
* 设置任务执行间隔,以秒为单位
*/
public abstract void setInterval(long interval) throws LaunchException;
// protected void execute(Runnable command)
// {
// executors.execute(command);
// }
}
15 个解决方案
#1
呵呵~~
#2
..不懂
#3
CPU利用率100%只能说明你写的线程占着CPU不放(最大可能性是优先级过高),线程开启后忘记关闭或者释放一些资源(本人从windows编程角度来说明的,如有错处请指正)
#4
应该是你开启的某个线程一直占用了 CPU,在 CPU 看来,是不分主线程、次线程的。
while (it.hasMorePages()) 这个循环所在的线程如果没有停止,可能就是问题所在。
while (it.hasMorePages()) 这个循环所在的线程如果没有停止,可能就是问题所在。
#5
线程的cpu占用率100%,我们C++界通常靠加Sleep来解决。
#6
在每一个线程的循环内+sleep(100)就可以了
#7
看看这个
try {
it = new DeviceIterator();
//logger.debug("device------------------------");
// System.out.println("共有 " + it.getTotalCount() + " 个");
while (it.hasMorePages()) {
/**
* 为每一页创建一个任务,并从executors中分配一个线程处理该任务
*/
// System.out.println("page " + counter);
//logger.debug("get Device");
executors.execute(new Task(it.next()));
// counter ++;
Sleep(1);//!!!加上这个你再看看!!!
}
#8
线程当掉或者线程占用cpu100%,这说明什么, 这说明线程设计严重有问题
请遵循以下原则:
1、不轻易使用while()等一直耗cpu时间的函数
2、请使用内核对象来处理线程休息、同步等事请,如临界区、互斥对象、信号量等等
3、请使用等待内核对象的方式来工作线程,否则会占用CPU很多时间,WaitForSingleObject() WaitForMultiplyObject()
请遵循以下原则:
1、不轻易使用while()等一直耗cpu时间的函数
2、请使用内核对象来处理线程休息、同步等事请,如临界区、互斥对象、信号量等等
3、请使用等待内核对象的方式来工作线程,否则会占用CPU很多时间,WaitForSingleObject() WaitForMultiplyObject()
#9
while (it.hasMorePages()) {}
这个循环不是死循环,是分页的方式取出数据库的数据,是可以取完的,
会不会是对数据库操作太频繁,我的4个主线程加很多子线程都是对数据库有操作。
#10
其实我的循环是没有死循环的,都是一定量的,会不会是线程之间切换造成的。
如果我加sleep.在java中存在Thread.currentThread.sleep(1)和
Thread.sleep(1)这两种。我用哪个呢。
#11
这里加入的话Thread.currentThread.sleep(1)和
Thread.sleep(1)这两种。和C++的不一样,
不知道C++的sleep(1)是睡掉当前线程还是睡掉所有线程呢。
#12
C++的Sleep和C#的Thread.sleep都是让当前线程睡眠
#13
不知道管不管用,我这些线程对数据库的操作比较频繁。
并没有while(true)这种情况,我也采用了sleep的方式。
#14
加了sleep,目前是没出问题,但不知道能坚持多久。
#15
打印信息出来,看看是哪个线程在狂转,或者线程内部的函数狂转.
#1
呵呵~~
#2
..不懂
#3
CPU利用率100%只能说明你写的线程占着CPU不放(最大可能性是优先级过高),线程开启后忘记关闭或者释放一些资源(本人从windows编程角度来说明的,如有错处请指正)
#4
应该是你开启的某个线程一直占用了 CPU,在 CPU 看来,是不分主线程、次线程的。
while (it.hasMorePages()) 这个循环所在的线程如果没有停止,可能就是问题所在。
while (it.hasMorePages()) 这个循环所在的线程如果没有停止,可能就是问题所在。
#5
线程的cpu占用率100%,我们C++界通常靠加Sleep来解决。
#6
在每一个线程的循环内+sleep(100)就可以了
#7
看看这个
try {
it = new DeviceIterator();
//logger.debug("device------------------------");
// System.out.println("共有 " + it.getTotalCount() + " 个");
while (it.hasMorePages()) {
/**
* 为每一页创建一个任务,并从executors中分配一个线程处理该任务
*/
// System.out.println("page " + counter);
//logger.debug("get Device");
executors.execute(new Task(it.next()));
// counter ++;
Sleep(1);//!!!加上这个你再看看!!!
}
#8
线程当掉或者线程占用cpu100%,这说明什么, 这说明线程设计严重有问题
请遵循以下原则:
1、不轻易使用while()等一直耗cpu时间的函数
2、请使用内核对象来处理线程休息、同步等事请,如临界区、互斥对象、信号量等等
3、请使用等待内核对象的方式来工作线程,否则会占用CPU很多时间,WaitForSingleObject() WaitForMultiplyObject()
请遵循以下原则:
1、不轻易使用while()等一直耗cpu时间的函数
2、请使用内核对象来处理线程休息、同步等事请,如临界区、互斥对象、信号量等等
3、请使用等待内核对象的方式来工作线程,否则会占用CPU很多时间,WaitForSingleObject() WaitForMultiplyObject()
#9
while (it.hasMorePages()) {}
这个循环不是死循环,是分页的方式取出数据库的数据,是可以取完的,
会不会是对数据库操作太频繁,我的4个主线程加很多子线程都是对数据库有操作。
#10
其实我的循环是没有死循环的,都是一定量的,会不会是线程之间切换造成的。
如果我加sleep.在java中存在Thread.currentThread.sleep(1)和
Thread.sleep(1)这两种。我用哪个呢。
#11
这里加入的话Thread.currentThread.sleep(1)和
Thread.sleep(1)这两种。和C++的不一样,
不知道C++的sleep(1)是睡掉当前线程还是睡掉所有线程呢。
#12
C++的Sleep和C#的Thread.sleep都是让当前线程睡眠
#13
不知道管不管用,我这些线程对数据库的操作比较频繁。
并没有while(true)这种情况,我也采用了sleep的方式。
#14
加了sleep,目前是没出问题,但不知道能坚持多久。
#15
打印信息出来,看看是哪个线程在狂转,或者线程内部的函数狂转.