マルチスレッドを使用して、単純なサーモスタットをシミュレートしようとしています。サーモスタットは、ユーザーが要求した値 (以下のコードの「最大」値) に到達するために温度を上げる必要があります。私は2つのスレッドを持っています.1つは温度を上げることを担当し、もう1つは温度を下げることを担当しています。減る条件はガス抜き時のみ。しかし、この概念の実装には問題があります。希望の温度を上げるために上ボタンを押すたびに、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());
}
}
}
};`