java - java中的sleep方法是如何工作的

标签 java exception

我有以下代码:

import java.security.SecureRandom;

public class Producer implements Runnable
{
   private static final SecureRandom generator = new SecureRandom();
   private final Buffer sharedLocation; // reference to shared object

   // constructor
   public Producer(Buffer sharedLocation)
   {
      this.sharedLocation = sharedLocation;
   } 

   // store values from 1 to 10 in sharedLocation
   public void run()                             
   {
      int sum = 0;

      for (int count = 1; count <= 10; count++)
      {
         try // sleep 0 to 3 seconds, then place value in Buffer
         {
            Thread.sleep(generator.nextInt(3000)); // random sleep
            sharedLocation.blockingPut(count); // set value in buffer
            sum += count; // increment sum of values
            System.out.printf("\t%2d%n", sum);
         } 
         catch (InterruptedException exception) 
         {
            Thread.currentThread().interrupt(); 
         } 
      } 

      System.out.printf(
         "Producer done producing%nTerminating Producer%n");
   } 
} // end class Producer

我不明白其中的“try-catch”部分: sleep() 方法不是会抛出 InterruptedException() 并因此 try block 将终止并且 catch block 将执行吗? 那么我们在try block 的sleep()语句后面怎么写语句呢,即他们不会执行,对吗?

最佳答案

Thread.sleep正常完成时,任何后续语句都将被执行。只有当线程在 sleep 之前或期间被中断时,这些语句才不会被执行。

请注意,try/catch 应该在循环周围:就目前情况而言,由于 Thread.currentThread().interrupt(),下一个循环迭代的 sleep 将立即中断,然后调用Thread.currentThread().interrupt(),下一次循环迭代的 sleep 将立即中断,等等

一旦循环被中断,你也可以放弃:

try {
  for (int count = 1; count <= 10; count++)
  {
     Thread.sleep(generator.nextInt(3000)); // random sleep
     // ...
  }
} catch (InterruptedException exception) {
  Thread.currentThread().interupt(); 
}

关于java - java中的sleep方法是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48938324/

相关文章:

java - org.openqa.selenium.UnhandledAlertException : unexpected alert open

python - 如何使用 python 日志框架在带有回溯的警告或信息级别记录异常?

java - 为什么我的异常(exception)不起作用

java - 保存到数据库后如何维护JPA @Transient字段

java - JDBC 通用查询执行

java - 在客户端和服务器 Bootstrap 之间共享 EventLoopGroup

windows - 如何在 PowerShell 中捕获异常?

javascript - 在哪里可以找到 Angular.js 抛出的异常的描述?

java - 继承DatabaseManager类或使其成为单例对象来实现DAO模式哪个更好?为什么?

Java 继承/OOP - 仅使用父级句柄调用子类型特定方法