rt我的swing程序中有一个主线程和一个计时线程,两个线程都要修改一个显示程序状态的面板,只要计时线程一启动cpu占用率就上去了,我以为是同步访问的问题,但是加了synchronized后还是一样,不知道是什么原因,谢谢各位赐教:)以下是代码片段:// 主线程一直运行中,不定时修改statusPanel===============================statusPanel.reset(1);...// 停止计时,这里秒表停后计时线程就自动关闭了==============================
stopWatch.stop();
// ===================================================================
// 弹出下面对话框的时候cpu占用率直线下降==================================flag2 = true;
int selection = JOptionPane.showConfirmDialog(
TypeDemoFrame.this, "是否进入下一环节", "",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE);
if (selection == JOptionPane.OK_OPTION)
{
goToNextBtn.setEnabled(false);
stage = 5;
flag1 = true;
break;
}goToNextBtn.setEnabled(true);// 继续计时,此后cpu占用率直线上升==================================
while (countThread != null && countThread.isAlive())
{
}
countThread = new CountThread(false);
countThread.start();
// =============================================================
计时线程源代码
/*
 * 计时线程
 */
private class CountThread extends Thread
{
...
public void run()
{
...
while (stopWatch.getState())
{
try
{
sleep(1000);                                // statusPanel是显示程序运行状态的面板
statusPanel.getTimeLabel().setText(stopWatch.getTimeString1());
// 开始计算速度
statusPanel.computeSpeed(stopWatch.getTime()); //
// 设置曲线图
//
queue.deq();
queue.enq(statusPanel.getSpeed().floatValue());
dataset = createDataset(lowerSpeed, queue);
chart = createChart(dataset);
chartPanel.setChart(chart); } catch (Exception e)
{
}
}
}
}

解决方案 »

  1.   


    这个要干什么,循环啊.
    一旦线程启动了,这就是个死循环.// 继续计时,此后cpu占用率直线上升==================================
    while (countThread != null && countThread.isAlive())
    {
    }
      

  2.   

    不是的while (countThread != null && countThread.isAlive()) 

    } 这个是保证之前的countThread已经停止运行,因为在stopWatch.stop();调用后countThread停止
      

  3.   

    那是不是应该用if?而不是while?还是你想一直等到你的countThread停止?
      

  4.   

    在计时线程中,有这样一段:        ...
            while (stopWatch.getState())
            {
            ...
    这里,作为循环条件的stopWatch.getState()有没有清除?
    应当写一个方法,在停止计时器的时候同时恢复该状态。
      

  5.   

    我已经找到问题根源,但是不知道怎么解决!!!:(问题如下:主线程中调用checkInput函数

    // 不断检查键盘输入,直到输入正确
    // str_pinyin是目标字符串
    while (!checkInput(str_pinyin))
    {}
    checkInput函数代码,和键盘监听类一起工作// 键盘输入正确返回true,否则返回false
    private boolean checkInput(String inputReqStr)
    {
    inputString = ""; // 键盘输入字符串变量,存放于全局变量中
    inputCount = inputReqStr.length(); // 目标字符串大小
            // 等待键盘监听类处理,每从键盘取得1个字符inputCount减1,直至减为0说明输入结束
            while (inputCount != 0)
    { }
    // 检查键盘输入与目标字符串是否一致
    if (inputReqStr.equals(inputString))
    {
    // 输入正确
    return true;
    } // 输入错误,报警提示错误
    Toolkit.getDefaultToolkit().beep();
    statusPanel.reset(0);
    return false;
    }
    键盘监听类:private class MyKeyListener implements KeyListener
    { public void keyPressed(KeyEvent evt)
    { } public void keyReleased(KeyEvent evt)
    {
    } public void keyTyped(KeyEvent evt)
    {
    if (inputCount > 0)
    {
    inputString = inputString + evt.getKeyChar();
    inputCount--;
    }
    }
    }
    ======================================================================问题出在checkInput里的哪个while循环上(红色标注),如果改为
    try
    {
        Thread.sleep(10000);
    }
    catch(Exception e)
    {
    }就没有cpu占用率高问题,但是这样的话无法与键盘输入同步.
    请各位大虾帮帮忙:)
      

  6.   

           
     // 等待键盘监听类处理,每从键盘取得1个字符inputCount减1,直至减为0说明输入结束
            while (inputCount != 0)
        {    }

    “// 等待键盘监听类处理,每从键盘取得1个字符inputCount减1,直至减为0说明输入结束”
    我从你这句话的理解,你的目的是想从键盘获得一个固定长度的输入,你可以输入之后判断这个输入的长度,如果等于你规定的长度则通过,如果不等于你规定的长度则给用户返回一个错误信息,就可以。
    不要用上面的循环来判断,这样的话,一直到输入等于你规定的长度之前,这个循环都一直在运行,如果时间足够长,有可能会内存溢出。
      

  7.   

    哈哈,已经自己解决了.要使用synchronized (mutex){}.checkInput中的while循环需要改为以下代码inputCount = inputReqStr.length(); // 先设置好需要输入的字符个数// mutex和condition是全局变量,mutex为Object类型,condition为boolean
    // 以下为同步代码
    synchronized (mutex)
    {
            while (!condition)
    {
       try
    {
       // 等待键盘输入完成信号mutex.notify();
    mutex.wait(); 
    } catch (Exception e)
    {}
    }
    }
    监听器中代码改为:public void keyTyped(KeyEvent evt)
    {
            if (inputCount > 0)
            {
            System.out.print(evt.getKeyChar());
            inputString = inputString + evt.getKeyChar();
            inputCount--;
            }        if (inputCount == 0)
            {
                    // 同步代码
            synchronized (mutex)
            {
            inputCount = -1;
            condition = true; // 设置完成标志为true
            mutex.notify(); // 通知等待线程输入完毕
            }
            }
     }
    不过还是谢谢大家!