java 如何在没有try/catch的情况下创建延迟?

mmvthczy  于 2023-06-04  发布在  Java
关注(0)|答案(5)|浏览(127)

有没有一种方法可以在不使用try/catch的情况下创建延迟?
我尝试使用Thread.sleep(5000);wait(5);命令,但它一直抛出InterruptedException错误,除非我使用try/catch。我希望能够使用简单的命令,因为我使用了很多命令。

wgxvkvu9

wgxvkvu91#

它不会抛出被中断的异常--它可能在运行时抛出。所以你得把它包起来。
您可以创建一个具有try catch的函数并调用它,而不是每次都像这样编写try catch

void dontCareSleep(long time) {
try { Thread.sleep(time) } catch (Exception e) {}
}

现在你可以在任何地方使用这个方法
另一种选择是使用Kotlin,而不是每次都尝试捕获睡眠

6ojccjat

6ojccjat2#

每当你想多次执行某个任务时,你可以编写一个方法,而不是一遍又一遍地复制/粘贴相同的代码。“睡一会儿”听起来像是一个非常简单的工作,但它真的不是,所以,它变成了一种方法!

/**
 * Pauses this thread for {@code millis} milliseconds.
 *
 * If interrupted, the thread restarts immediately, and the
 * interruption flag remains set.
 */
public static void sleep(long millis) {
  try {
    Thread.sleep(millis);
  } catch (InterruptedException e) {
    // Best course of action is to stop sleeping but propagate
    // the interruption so the caller gets to deal with it.
    Thread.currentThread().interrupt();
  }
}
1hdlvixo

1hdlvixo3#

只需要写一个方法或lambda。你可以把它放在你的图书馆里。

public static void sleep(long mill){
  try {
     Thread.sleep(mill);
  } catch(InterruptedException e){
       Thread.currentThread()
             .interrupt();
  }
}

或者创建一个lambda。这里使用LongConsumer

LongConsumer sleep = (delay) -> {
     try {
         Thread.sleep(delay);
     } catch (InterruptedException e) { 
        Thread.currentThread()
              .interrupt(); 
 };

并按如下方式调用它:

sleep.accept(1000);
31moq8wy

31moq8wy4#

有两种方法:

1)协同程序

尝试使用coroutines。这很容易,不会阻塞你的主线程
调用函数

addDelay(500) {
    // showToast
}

声明函数

fun addDelay(timeMillis: Int = 1000, callback: () -> Unit) {
    CoroutineScope(Dispatchers.Main).launch {
        delay(timeMillis.toLong())
        callback.invoke()
    }
}

2)处理器

调用函数

withDelay(500) {
    // showToast
}

声明函数

fun withDelay(timeMillis: Int = 1000, callback: () -> Unit) {
    Handler(Looper.getMainLooper()).postDelayed(block, timeMillis)
}
dgsult0t

dgsult0t5#

根据你为什么要睡觉,可能有比Thread.sleep()更好的替代方法。
如果您在测试中等待一些异步操作完成,我发现像awaitility这样的工具是一个很好的选择,特别是对于测试。
基本上,而不是

longRunningOperation();

Thread.sleep();
assertTrue(getResult());

你会的

await()
  .atMost(Duration.ofMillis(x))
  .pollInterval(Duration.ofMillis(y))
  .until(getResult());

如果时间到了,它会抛出一个异常,但它是一个RuntimeException,所以你不必捕捉它。
我最近写了一篇关于这个主题的文章,如果你有兴趣了解更多:https://link.medium.com/pJGQaQLnjAb

相关问题