【问题标题】:Java Delay/WaitJava 延迟/等待
【发布时间】:2011-12-21 07:00:15
【问题描述】:

如何将 while 循环延迟到 1 秒间隔,而不会将运行的整个代码/计算机减慢到 1 秒延迟(只是一个小循环)。

【问题讨论】:

  • 不减慢整个代码的速度详细说明
  • @JigarJoshi 我正在尝试为我的 Minecraft 插件以 1 秒的间隔延迟这个 while 循环。但是大多数等待方法会在设定的时间内暂停整个服务器,而不仅仅是循环
  • 您希望在固定的时间段内执行 while 循环,然后以固定的延迟再次执行。

标签: java loops delay wait notify


【解决方案1】:

Thread.sleep(1000); // do nothing for 1000 miliseconds (1 second)

【讨论】:

  • 这不会暂停整个脚本/计算机吗?
  • 这只会暂停运行此代码的特定线程。您的计算机不会被冻结
【解决方案2】:

您的循环似乎在主线程上运行,如果您在该线程上执行sleep,它将暂停应用程序(因为只有一个线程已暂停),要克服这个问题,您可以将此代码放入新的@ 987654322@ 并行运行

try{

  Thread.sleep(1000);
}catch(InterruptedException ex){
  //do stuff
}

【讨论】:

    【解决方案3】:

    我延迟循环的简单方法。

    在未能遵循 stackoverflow 的标准后,我已经将代码放在这里了。

    //1st way: Thread.sleep : Less efficient compared to 2nd
    try {
      while (true) {//Or any Loops
       //Do Something
       Thread.sleep(sleeptime);//Sample: Thread.sleep(1000); 1 second sleep
      }
     } catch (InterruptedException ex) {
       //SomeFishCatching
     }
    //================================== Thread.sleep
    
    
    //2nd way: Object lock waiting = Most efficient due to Object level Sync.
    Object obj = new Object();
     try {
      synchronized (obj) {
       while (true) {//Or any Loops
       //Do Something
       obj.wait(sleeptime);//Sample obj.wait(1000); 1 second sleep
       }
      }
     } catch (InterruptedException ex) {
       //SomeFishCatching
     }
    //=============================== Object lock waiting
    
    //3rd way:  Loop waiting = less efficient but most accurate than the two.
    long expectedtime = System.currentTimeMillis();
    while (true) {//Or any Loops
       while(System.currentTimeMillis() < expectedtime){
         //Empty Loop   
       }
       expectedtime += sleeptime;//Sample expectedtime += 1000; 1 second sleep
       //Do Something
    }
    //===================================== Loop waiting
    

    【讨论】:

    • 我喜欢第三种方式,因为它可以抑制整个 cpu 内核,而且没有人永远会称之为代码异味。
    • 第三种方法的另一个优点是它不需要额外的 try/catch 块。
    【解决方案4】:

    正如 Jigar 所指出的,您可以使用另一个线程来完成可以独立于其他线程运行、睡眠等的工作。 java.util.Timer 类也可能对您有所帮助,因为它可以为您执行定期任务,而无需您进行多线程编程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      • 2012-05-27
      • 2014-03-11
      • 1970-01-01
      相关资源
      最近更新 更多