java InvokeLater冻结GUI
我试图用多线程来模拟一个简单的恒温器。恒温器应提高温度,以达到用户要求的值,即以下代码中的“最大”值。我有两个线程,一个负责提高温度,另一个负责降低温度。但降低的条件是,它应该只在燃气关闭时运行。但我在实施这个概念时遇到了一个问题。每次我按下Up按钮以增加所需的温度时,GUI都会冻结。我怎样才能解决这个问题
就像一根线抓住了锁,不会松开,但我怎么能注意到是哪根
`private volatile boolean isBoilerOn = false;
protected int Max, Current;
protected boolean isDone, isGasOn, isPumpOn;
private temperatureUp tempUp;
private temperatureDown tempDown;
public void setBoilerSatus(boolean status) {
this.isBoilerOn = status;
}
public boolean getBoilerStatus() {
return this.isBoilerOn;
}
private synchronized void setGasBoilerStatus() {
if(Max>Current)
setBoilerSatus(true);
else
setBoilerSatus(false);
notifyAll();
}
private void btnUpActionPerformed(java.awt.event.ActionEvent evt) {
if(Max<=8)
{
Max++;
String strI = String.valueOf(Max);
lblDesiredTemp.setText(strI);
setGasBoilerStatus();
}
}
private void btnDownActionPerformed(java.awt.event.ActionEvent evt) {
if(Max>0)
{
Max--;
String strI = String.valueOf(Max);
lblDesiredTemp.setText(strI);
setGasBoilerStatus();
}
}
private void formWindowActivated(java.awt.event.WindowEvent evt) {
systemInitial();
tempUp = new temperatureUp();
tempDown = new temperatureDown();
tempUp.start();
tempDown.start();
}
private synchronized void increaseTemeture() throws InterruptedException
{
while (!getBoilerStatus())
wait();
if(Max>Current)
{
Thread.sleep(4000);
Current ++;
}
setGasBoilerStatus();
}
private synchronized void decreaseTemeture() throws InterruptedException
{
while(getBoilerStatus()) wait();
Thread.sleep(4000);
if(Current == 0 )
return;
Current --;
setGasBoilerStatus();
}
private void systemInitial()
{
isGasOn = false;
Max = Current = 0;
}
class temperatureUp extends Thread
{
@Override
public void run()
{
while(true)
{
try
{
increaseTemeture();
}
catch(Exception ex)
{
StringWriter w = new StringWriter();
ex.printStackTrace(new PrintWriter(w));
txtLog.setText(w + "\n" + txtLog.getText());
}
}
}
};
class temperatureDown extends Thread
{
@Override
public void run()
{
while(true)
{
try
{
decreaseTemeture();
}
catch(Exception ex)
{
StringWriter w = new StringWriter();
ex.printStackTrace(new PrintWriter(w));
txtLog.setText(w + "\n" + txtLog.getText());
}
}
}
};`
# 1 楼答案
这是因为您没有正确使用invokeLater。看看这里:Java AWT Threads