[英]Thread.Sleep alternative in Java
我被告知使用Thread.Sleep()
是一个糟糕的解决方案,有时人们希望在同步方法的一个循环操作中产生一些时间间隔。
另一方面,我有两个不同的线程,它们在我的程序的运行时间和一个共享对象中都是活动的,当我在该共享对象中使用Object.wait(long)时,它会导致我的GUI冻结一段时间。
什么是这个问题的更好的解决方案?
更新此部分代码包含一个以GUI开头的线程:
class temperatureUp extends Thread { @Override public void run() { while(true) { try { GBC.increaseTemp(); updateSystemStatus(); } catch(Exception ex) { StringWriter w = new StringWriter(); ex.printStackTrace(new PrintWriter(w)); txtLog.setText(w + "\n" + txtLog.getText()); } } } };
这是共享对象中的同步方法,GBC:
public synchronized void increaseTemp() throws InterruptedException{
// don't increase the temperature if the boiler
// is not turned on...
while (!isBoilerOn)
wait();
// increase the current temperature
if ((currentTemp + 1) < MAX_TEMP && currentTemp < desiredTemp) {
Thread.sleep(2000); ///what should put here if not thread sleep?
currentTemp ++;
updateGasBoilerStatus();
}
}
不要在同步方法内睡觉! 不要在GUI事件处理程序/方法中等待!
拆分同步操作,以便在GUI线程上下文中不调用Sleep()调用。
也许使用InvokeLater()作为第二位。
您可以缩小synchronize
语句的范围。 例如,如果您正在同步整个方法
public synchronized void foo()
您可以删除修改器并使用同步块
synchronized (this) {
// ...
}
如果可能的话,将Thread.sleep()
移到该块之外。 仅同步那些修改共享数据状态的语句。
关于Swing的许多线程问题都与Event Dispatcher Thread有关 ,可以很容易地解决它。 我建议你读一读。
一点背景,为什么你不应该在同步块中调用Thread.sleep()
:
睡觉或等待,同时拿着一把锁。 使用锁定调用Thread.sleep可以防止其他线程长时间进展,因此可能存在严重的活动危险。 使用两个锁定调用Object.wait或Condition.await会产生类似的危险。 [JCIP]
我会使用监视器: http : //www.artima.com/insidejvm/ed2/threadsynch4.html也许通过notify或notifyAll你可以解决它。 祝好运!
始终保持负责处理GUI的事件调度程序线程(EDT),远离任何非UI工作。 此外,不要同步整个方法,而是同步原子语句
synchronized(this){
//...
}
您可以尝试以下代码:
public static void delay(int waitTime) {
long endTime = System.currentTimeMillis() + (waitTime * 1000);
while (System.currentTimeMillis() < endTime) {}
}
呼叫延迟(5)。 控制将等待5秒钟。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.