gpt4 book ai didi

java - 线程不会唤醒

转载 作者:行者123 更新时间:2023-11-30 07:24:25 25 4
gpt4 key购买 nike

我正在尝试使用多线程模拟一个简单的恒温器。我在 lblDesiredTemp 和另一个标签上保存了一个所需的温度值来显示当前温度 lblCurrentTemp。当系统中有两个以上的 Activity 线程时会出现问题。正在等待的线程不会醒来!

这是我的方法:

'private synchronized void ApplySetting()
{
Thread tempetureUpdater = new Thread()
{
@Override
public synchronized void run()
{
txtLog.setText(txtLog.getText() + "\n" + this.getName());
try
{
while(!isDone)
this.wait();
}
catch (InterruptedException ex)
{
txtLog.setText(txtLog.getText() + "\n" + ex.getMessage());
}<p></p>

int Max = Integer.parseInt(lblDesiredTemp.getText());
int Current = Integer.parseInt(lblCurrentTemp.getText());

txtLog.setText(txtLog.getText() + "\n" + Current + " to " + Max);

if(Current > Max)
{
isDone = false;

for (int i = Current; i > Max; i--)
{
lblGasStatus.setText("Off");
try
{
Thread.sleep(3000);
decreaseTemeture();
}
catch (InterruptedException ex)
{
txtLog.setText(txtLog.getText() + "\n" + ex.getMessage());
}
}

txtLog.setText(txtLog.getText() + "\n" + this.getName() + " done!");
isDone = true;
this.notifyAll();
}
else
{
isDone = false;

for (int i = Current; i < Max; i++)
{
lblGasStatus.setText("On");
try
{
Thread.sleep(3000);
increaseTemeture();
}
catch (InterruptedException ex)
{
txtLog.setText(txtLog.getText() + "\n" + ex.getMessage());
}
}

txtLog.setText(txtLog.getText() + "\n" + this.getName() + " done!");
isDone = true;
this.notifyAll();
}
// Report the result using invokeLater().
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
setEnabled(true);
}
});
}
};
tempetureUpdater.start();
}

有什么问题?!

最佳答案

The problem occur when while there's more than two active thread in system. the threads which are waiting won't wake up!

那么您希望他们怎么做?您只会通知“当前”对象,这是一个新线程。当一个线程完成时,它将调用 this.notifyAll,但这不会唤醒其他线程。

此外,我强烈敦促您更改有关您的写作方式的其他方面:

  • 这种规模的匿名内部类迫切需要分解成一个适当命名的类
  • ApplySetting 方法名称不遵循 Java 命名约定。同上各种变量名称。
  • 扩展 Thread 通常不是一个好主意 - 改为实现 Runnable,并将 Runnable 传递给线程构造函数
  • 你不应该在 Thread 对象上调用 waitnotify/notifyAll,作为 Thread 用它来发信号给自己
  • 同步私有(private)引用通常是个好主意,没有其他代码将用于同步或发信号
  • 如 Marko 的回答中所述,使 run 方法同步几乎总是一个坏主意。考虑到前面的要点,我不希望同步任何整个方法,而是同步方法中的单个引用
  • 看起来您正在尝试在非 UI 线程中更新 UI 元素;我相信那会失败。 (你需要使用invokeLater)

关于java - 线程不会唤醒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11490111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com