论坛首页 移动开发技术论坛

2个socket接收数据,5分钟左右cpu飙至100%.

浏览 6907 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-10-15  
小弟遇到个问题,急需解决,望大家帮忙看看.写了一个程序,在启动一个线程后,在里面根据socket请求,又启动了新的线程,有几个新的socket请求,就启动几个线程进行数据接收和处理,这样做可以么?为什么开2个跑5分钟接收数据cpu就100%了..急需解决.谢谢

/**
     * 仪器数据处理线程 每一个socket请求过来认为是一个仪器,一个仪器开一条线程
     * 首先启动连接仪器监听线程
     * 当有socket请求时,启动仪器数据处理线程,除非两边手动断开,否则不会中断
     */
    @Override
    public void run() {
        time.schedule(new LabDeviceListener(loader), 3000, 5000);
        while (!this.isInterrupted()) {
            try {
                Socket socket = serverSocket.accept();
                if (null != socket) {
                    CreateObject co = new CreateObject(socket, loader);
                    co.setDaemon(true);
                    co.start();
                }
            } catch (IOException ex) {
            }
        }
    }
[code/]
   发表时间:2012-10-15   最后修改:2012-10-15
一直处理while循环当然cpu会疯掉了,试着让线程休息一下
0 请登录后投票
   发表时间:2012-10-15  
serverSocket.accept(); 这是一个阻塞时的方法,如果没有client端连接的话是不会执行下一步的

time.schedule(new LabDeviceListener(loader), 3000, 5000);

尽量不要这样循环的一直执行这个任务new LabDeviceListener(loader)

你每五秒钟就创建一个这个对象

如果LabDeviceListener 这个里面还有这段代码的话,那每次就会多出来很多这样的任务,这样就会无线的增长,cpu100%

请把LabDeviceListener这个类贴出来
0 请登录后投票
   发表时间:2012-10-15  
有几个新的socket请求,就启动几个线程进行数据接收和处理

1.这个思路有问题,建议使用一个线程池来控制线程数量。

2.在这个循环中会创建多少个socket对象?
while (!this.isInterrupted()) {
            try {
                Socket socket = serverSocket.accept();



0 请登录后投票
   发表时间:2012-10-15  
use mina or netty.
0 请登录后投票
   发表时间:2012-10-15  
最近也遇到一个这样的问题 ,求教,应该如何处理,CPU 使用过高的问题
0 请登录后投票
   发表时间:2012-10-15  
死循环CPU肯定是吃不消的,一般都会sleep一下,让出资源让系统甘其它的活
0 请登录后投票
   发表时间:2012-10-15  
线程就是死循环,如果你执行后不休眠,不管什么程序都会挂掉的!
Socket编程也是一样,其实是每隔一段时间从管道中读取流,这个间隔可以段,但是必须有!
0 请登录后投票
   发表时间:2012-10-16  
qiaohhgz 写道
serverSocket.accept(); 这是一个阻塞时的方法,如果没有client端连接的话是不会执行下一步的

time.schedule(new LabDeviceListener(loader), 3000, 5000);

尽量不要这样循环的一直执行这个任务new LabDeviceListener(loader)

你每五秒钟就创建一个这个对象

如果LabDeviceListener 这个里面还有这段代码的话,那每次就会多出来很多这样的任务,这样就会无线的增长,cpu100%

请把LabDeviceListener这个类贴出来

问题应该不是出在循环上 而是time.schedule(new LabDeviceListener(loader), 3000, 5000);

linux 找出占用cpu最高的线程
http://hi.baidu.com/delete_h/item/7751cb9627c24c4ff042157f
0 请登录后投票
   发表时间:2012-10-16  
zuo_huai 写道
最近也遇到一个这样的问题 ,求教,应该如何处理,CPU 使用过高的问题

应该是循环的问题,我这里通过跳出循环, 启动10个线程,总共处理10000 个数据,CPU 使用情况是 20%~30% ,在正常的范围中
0 请登录后投票
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics