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)
{
}
}
}
}
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)
{
}
}
}
}
这个要干什么,循环啊.
一旦线程启动了,这就是个死循环.// 继续计时,此后cpu占用率直线上升==================================
while (countThread != null && countThread.isAlive())
{
}
{
} 这个是保证之前的countThread已经停止运行,因为在stopWatch.stop();调用后countThread停止
while (stopWatch.getState())
{
...
这里,作为循环条件的stopWatch.getState()有没有清除?
应当写一个方法,在停止计时器的时候同时恢复该状态。
// 不断检查键盘输入,直到输入正确
// 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占用率高问题,但是这样的话无法与键盘输入同步.
请各位大虾帮帮忙:)
// 等待键盘监听类处理,每从键盘取得1个字符inputCount减1,直至减为0说明输入结束
while (inputCount != 0)
{ }
“// 等待键盘监听类处理,每从键盘取得1个字符inputCount减1,直至减为0说明输入结束”
我从你这句话的理解,你的目的是想从键盘获得一个固定长度的输入,你可以输入之后判断这个输入的长度,如果等于你规定的长度则通过,如果不等于你规定的长度则给用户返回一个错误信息,就可以。
不要用上面的循环来判断,这样的话,一直到输入等于你规定的长度之前,这个循环都一直在运行,如果时间足够长,有可能会内存溢出。
// 以下为同步代码
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(); // 通知等待线程输入完毕
}
}
}
不过还是谢谢大家!