【问题标题】:Time schedular in java with Thread.sleep带有 Thread.sleep 的 java 中的时间调度程序
【发布时间】:2016-09-30 09:14:19
【问题描述】:
  import java.util.Date;

  import javax.xml.crypto.Data;

  public class Task1 {
    public static void main(String[] args) {
      // run in a second
      final long timeInterval = 4000;
      Data now = null;
      Runnable runnable = new Runnable() {
        public void run() {
          while (true) {
            // ------- code for task to run
            System.out.println("Hello !!"+new Date());
            for(int i=0;i<10000;i++){
              System.out.println("Hello !!");
            }

            // ------- ends here
            try {
              Thread.sleep(timeInterval);
            } catch (InterruptedException e) {
              e.printStackTrace();
            }
          }
       }

      };

      Thread thread = new Thread(runnable);
      thread.start();
    }
  }

我阅读了有关线程调度的教程。我想了解代码运行良好并在 4 秒后执行线程,但如果 for 循环所花费的时间假设为 1 秒,那么总时间将为 1+ 4 5 秒。 我不想执行服务。只是普通的线程类。谁能解释这个程序是如何工作的。

【问题讨论】:

    标签: java multithreading thread-sleep


    【解决方案1】:

    你说得对,sleep 已经超出了循环所花费的时间。

    即使您计算了剩余的睡眠时间,它仍然可能需要更长的时间,因为无法保证睡眠会以多快的速度唤醒。有时可能会晚几十毫秒。

    ExecutorService 所做的是计算何时应该从第一次运行中唤醒并确保不会累积任何延迟。它使用 System.nanoTime(),因此挂钟的更正不会影响周期。

    【讨论】:

    • 我在一次采访中被问到这个问题,解决这个问题的最佳方法是在没有执行器的情况下在一定间隔后执行线程
    • @coder25 显然最好的方法是使用 ScheduledExecutorService,或者做它所做的就是在开始时使用 System.nanoTime() 并计算每次应该休眠多长时间以避免累积错误。如果挂钟很重要,您可以使用 System.currentTimeMillis()
    猜你喜欢
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 2019-06-13
    • 1970-01-01
    相关资源
    最近更新 更多