繁体   English   中英

Thread.Sleep在Java中的替代品

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM