public class StatDataWorker {
  private final PoolWorker[] threads;
  private final LinkedList queue = new LinkedList();  public StatDataWorker(int nThreads) {
    threads = new PoolWorker[nThreads];
    for (int i = 0; i < nThreads; i++) {
      threads[i] = new PoolWorker();
      threads[i].start();
    }
  }  public boolean isEmpty() {
    return queue.isEmpty();
  }  public boolean workOver() {
    for (int i = 0; i < threads.length; i++) {
      if(!threads[i].saveOk) return false;
    }
    return true;
  }  public void execute(ParsedData parsedData) {
    synchronized(this.queue) {
      this.queue.add(parsedData);
      this.queue.notify();
    }
  }  private class PoolWorker extends Thread {
    private ParsedData parsedData = null;
    private boolean saveOk = true;    public void run() {
      while (true) {
        synchronized(queue) {
          while (queue.isEmpty()) {
            try {
              queue.wait();
            } catch (Exception ex) {ex.printStackTrace();}
          }
          try {
            this.parsedData = (ParsedData) queue.removeFirst();
          } catch (Exception ex) {ex.printStackTrace();}
        }
        try {
          this.saveOk = false;
          if(this.parsedData != null) {
            StatDataParser _parser = new StatDataParser();
            _parser.parse(this.parsedData);
            _parser.save();
            this.parsedData = null;
          }
        } catch (Exception ex) {
          ex.printStackTrace();
        } finally {
          this.saveOk = true;
        }
      }
    }
  }
}这是我的一个线程组的源代码,但是当队列没有空闲的情况下,这种写法的CPU使用率就会上升很快,甚至到100%,极其影响服务器的性能,有没有更高的写法能解决CPU使用率的问题,谢谢了。

解决方案 »

  1.   

    哪个地方有死循环的语句了吧,你检查一下。常规使用wait之类的,不会导致cpu上升了,除非某个地方使用了死循环 进行了迭代,而且一直处在死循环里面
      

  2.   

    正常情况下,CPU不会上升的,但是当队列里面一直有需要处理的数据时,CPU就是上去。
      

  3.   

    正常情况下,CPU不会上升的,但是当队列里面一直有需要处理的数据时,CPU就是上去。
    由于服务器是一个高并发的服务器,所以当并发数越多时队列就有可能存在非空闲的情况,这个时候while(true)就相当于陷入了死循环,而不会启用wait,从而导致CPU使用率上升。
      

  4.   

    我把代码简化下给大家看看吧public class StatDataWorker {
      private final PoolWorker thread;
      private final LinkedList queue = new LinkedList();  public StatDataWorker() {
        thread = new PoolWorker();
      }  public void execute(ParsedData parsedData) {
        synchronized(this.queue) {
          this.queue.add(parsedData);
          this.queue.notify();
        }
      }  private class PoolWorker extends Thread {
        private ParsedData parsedData = null;    public void run() {
          while (true) {
            synchronized(queue) {
              while (queue.isEmpty()) {
                try {
                  queue.wait();
                } catch (Exception ex) {ex.printStackTrace();}
              }
              try {
                this.parsedData = (ParsedData) queue.removeFirst();
              } catch (Exception ex) {ex.printStackTrace();}
            }
            try {
              if(this.parsedData != null) {
                StatDataParser _parser = new StatDataParser();
                _parser.parse(this.parsedData);
                _parser.save();
                this.parsedData = null;
              }
            } catch (Exception ex) {
              ex.printStackTrace();
            }
          }
        }
      }
    }
      

  5.   


    public&npsp;class&npsp;StatDataWorker&npsp;{
    &npsp;&npsp;private&npsp;final&npsp;PoolWorker&npsp;thread;
    &npsp;&npsp;private&npsp;final&npsp;LinkedList&npsp;queue&npsp;=&npsp;new&npsp;LinkedList();&npsp;&npsp;public&npsp;StatDataWorker()&npsp;{
    &npsp;&npsp;&npsp;&npsp;thread&npsp;=&npsp;new&npsp;PoolWorker();
    &npsp;&npsp;}&npsp;&npsp;public&npsp;void&npsp;execute(ParsedData&npsp;parsedData)&npsp;{
    &npsp;&npsp;&npsp;&npsp;synchronized(this.queue)&npsp;{
    &npsp;&npsp;&npsp;&npsp;&npsp;&npsp;this.queue.add(parsedData);
    &npsp;&npsp;&npsp;&npsp;&npsp;&npsp;this.queue.notify();
    &npsp;&npsp;&npsp;&npsp;}
    &npsp;&npsp;}&npsp;&npsp;private&npsp;class&npsp;PoolWorker&npsp;extends&npsp;Thread&npsp;{
    &npsp;&npsp;&npsp;&npsp;private&npsp;ParsedData&npsp;parsedData&npsp;=&npsp;null;&npsp;&npsp;&npsp;&npsp;public&npsp;void&npsp;run()&npsp;{
    &npsp;&npsp;&npsp;&npsp;&npsp;&npsp;while&npsp;(true)&npsp;{
    &npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;synchronized(queue)&npsp;{
    &npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;while&npsp;(queue.isEmpty())&npsp;{
    &npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;try&npsp;{
    &npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;queue.wait();
    &npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;}&npsp;catch&npsp;(Exception&npsp;ex)&npsp;{ex.printStackTrace();}
    &npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;}
    &npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;try&npsp;{
    &npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;this.parsedData&npsp;=&npsp;(ParsedData)&npsp;queue.removeFirst();
    &npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;}&npsp;catch&npsp;(Exception&npsp;ex)&npsp;{ex.printStackTrace();}
    &npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;}
    &npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;try&npsp;{
    &npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;if(this.parsedData&npsp;!=&npsp;null)&npsp;{
    &npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;StatDataParser&npsp;_parser&npsp;=&npsp;new&npsp;StatDataParser();
    &npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;_parser.parse(this.parsedData);
    &npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;_parser.save();
    &npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;this.parsedData&npsp;=&npsp;null;
    &npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;}
    &npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;}&npsp;catch&npsp;(Exception&npsp;ex)&npsp;{
    &npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;ex.printStackTrace();
    &npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;&npsp;}
    &npsp;&npsp;&npsp;&npsp;&npsp;&npsp;}
    &npsp;&npsp;&npsp;&npsp;}
    &npsp;&npsp;}
    }