main函数中:
TerminalProcess tp = new TerminalProcess();
for(int i = 0; i < proThreadNum; i++){
Thread t = new Thread(tp, "tp" + i);
t.start();
}TerminalProcess类:
public class TerminalProcess extends Thread{
public void run(){
                while(true){
                    processData();
                }
}
}如何使用while(true){....},就会造成线程阻塞起来,CPU占用率达到100%,如果使用sleep或者wait,好像不是最理想的方法,有没有更好的办法?请大家指点一下!

解决方案 »

  1.   

    没有!这都死循环了,估计 processData 中也没有阻塞的时候,CPU 100% 是很正常的,因为 CPU 在高强度地进行计算。都不知道这程序在干嘛,是干嘛用的。
      

  2.   

    一般多线程run方法中用while(true),就要用到wait()和notifyAll()方法,wait()可以实现线程阻塞。
      

  3.   

    while(true)不是问题,以前在pushlet框架(comet)中看到过这样的语句,就是消息订阅之类的是吧。那得如楼上所说,wait()方法控制下线程,在需要的时候才notify。把processData()方法贴出来看看吧
      

  4.   

    可以用while(true)来让cpu在一个线程处打转,但得有控制线程的语句,否则就是死循环了
      

  5.   

    谢谢各位了,问题解决了,正如大家所说的要用wait()和notifyAll(),并在调用这两个方法前加上synchronized(对象监视器)!
      

  6.   


    public class TerminalProcess extends Thread{
    Object ob = null;
    public TerminalProcess(Object o){
    this.ob = o;
    }public void run(){
    while(true){
    try{
    synchronized(ob){
    processData();
    if(TerminalMsgQueue.getPoolSize() == 0){
    ob.wait();
    }
    }
    }catch(Exception e){
    logger.info(e.getMessage());
    }
    }
    } 另一个线程中:
    public class TerminalServer extends Thread{
    Object ob = null;

    public TerminalServer(Object o){
    this.ob = o;
    }
    public void run(){
    try{
                    ........
    synchronized(ob){
    ob.notifyAll();
    }
            }catch(Exception e){
            logger.info(e.getMessage());
    }
    }main函数中:
    private static final Object o = new Object();TerminalServer ts = new TerminalServer(o);
    new Thread(ts, "ts").start();TerminalProcess tp = new TerminalProcess(o);
    for(int i = 0; i < proThreadNum; i++){
    Thread t = new Thread(tp, "tp" + 0);
    t.start();
    }wait()和notify()用的是同一个监视器对象o