Java多线程中的Sleep方法

时间:2020-01-09 10:35:08  来源:igfitidea点击:

Java多线程中的Thread.sleep方法会导致当前正在执行的线程在指定时间段内暂停执行。

在Java Thread类中,有两个重载的sleep()方法

  • 静态void sleep(long millis)引发InterruptedException –使当前正在执行的线程进入指定的毫秒数休眠。
  • 静态无效睡眠(长毫秒,整数纳秒)引发InterruptedException –使当前正在执行的线程休眠指定的毫秒数和指定的纳秒数。

有关Java中sleep()方法的要点

  • 如果毫秒值是负数,则抛出IllegalArgumentException。
  • 如果纳秒的值不在0-999999范围内,则抛出IllegalArgumentException。
  • 虽然我们提供了持续时间线程,但应该将其作为睡眠方法中的一个参数进行睡眠,但这取决于系统计时器的精度和准确性以及在底层OS中如何实现调度程序。
  • 如果线程持有任何锁,则使用sleep()方法暂停线程时不会释放该锁的所有权。
  • 睡眠线程也可以中断,从而终止睡眠时间。

使用sleep()方法的优势

Java中的sleep()方法有助于使处理器时间可用于应用程序的其他线程或者计算机系统上可能正在运行的其他应用程序。

在使用sleep()方法开发多线程应用程序时,我们可以模拟许多用户访问应用程序并执行许多线程时在生产环境中可能发生的某些延迟。这将找出一些以后可能出现的错误。

使用sleep()方法的示例

public class InterruptDemo implements Runnable {
  @Override
  public void run() {
    for(int i = 0; i < 5; i++){
      try {
        Thread.sleep(500);
      } catch (InterruptedException e) {
        System.out.println("Thread " + Thread.currentThread().getName() + " interrupted, reason " + e.getMessage());        
        throw new RuntimeException("Thread interrupted", e);
      }
    }	
  }

  public static void main(String[] args) {
    Thread t = new Thread(new InterruptDemo());
    long startTime = System.currentTimeMillis();
    t.start();
    try {
      t.join();
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
      System.out.println("Total thread pause time - " + (System.currentTimeMillis() - startTime));
  }
}

输出:

Total thread pause time – 2527

如我们所见,run()方法中的循环运行了5次,因此总睡眠时间将为2500毫秒,但这并不是精确的持续时间。