当前位置: 首页 > 知识库问答 >
问题:

等待而不尝试-抓住[重复]

邵诚
2023-03-14

我正在开发一个永远运行的Java程序,但我不知道如何在不使用“try-catch”的情况下将每个循环延迟一秒钟。我试过了

import java.util.concurrent.TimeUnit;

public class program {
    public static void main(String[] args) {
        TimeUnit wait = new TimeUnit();
        while (true) {
            wait.SECONDS.sleep(1);
        }
    }
}

但它似乎不起作用。有人能帮我吗?

共有3个答案

葛俊
2023-03-14

您可以使用Thread.sleep(TIME_FOR_DELAY)行进行延迟,但您必须将其放入try-catch块中

try{
   //TODO before wait

   Thread.sleep(TIME_FOR_DELAY);

   //TODO after wait
}catch(InterruptedException e){
   // 
}
轩辕晔
2023-03-14

最直接的方法是创建一个方法。

public static void sleep(int delay) {
   try {
       TimeUnit.SECONDS.sleep(delay);
   } catch (InterruptedException ie) {
      Thread.currentThread().interrupt();
   }
}

现在,只要在需要睡眠时调用该方法即可。

for (int i = 0; i < 10; i++ ) {
    System.out.println(i);
    sleep(1);  // 1 second
}
郏博瀚
2023-03-14

经过一段时间的思考,我同意这一观点。显然,睡眠是使主线程在循环中暂停的直接方法。

不过,在其他可能不同的用例中,因为它暂停了可以同时执行其他任务的线程。这里讨论了计时器与线程。睡眠,如果你感兴趣的话,这里有另一个不太全面的答案,这个问题可能会被当作重复。

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

对于更苛刻的场景schduledThreadPoolExecator是您的朋友。

    ScheduledExecutorService executor = Executors.newScheduledThreadPool(poolSize);
    executor.schedule(() -> {
        // doSmthg
    }, 12, TimeUnit.HOURS);

另一种方法是Timer/Timertask,现在通常不鼓励使用ScheduledThreadPoolExecutor(thx到@rkosegi指出这一点)。池大小为1将模拟计时器/计时器任务功能。

另一方面,Timer/Timertask在单线程场景中对大量小任务具有优势“实现说明:此类可扩展到大量并发调度的任务(数千个任务应该没有问题)。在内部,它使用二进制堆表示其任务队列,因此调度任务的成本为O(log n),其中n是同时调度的任务数。,其中ScheduledExecutorService使用BlockingQueue。

new Timer().schedule(new TimerTask() {
        @Override
        public void run() {
            // do smthg;
        }
    }, someDelay);
 类似资料:
  • 我试图在JAVA中的while循环中使用try-catch语句,只是为了在向nextInt提供字符串输入时捕获异常,我不知道为什么它在第一次错误输入后继续引发异常。 密码 当给出正确的输入时。 但当输入错误时,这种情况会持续无限次。 会有很大的帮助,即使有人回答。 谢谢你。

  • 我试图将我从选择语句中得到的所有错误插入到错误表中,但我无法做到这一点。 现在我想看到我的表中的所有错误以及表中正确的所有一次,但我没有得到这个工作? 源系统的数据类型是,我的列是,因为值应该只有INT…所以这是源系统的糟糕设计?

  • 本文向大家介绍JavaScript 避免尝试/抓住对性能至关重要的功能,包括了JavaScript 避免尝试/抓住对性能至关重要的功能的使用技巧和注意事项,需要的朋友参考一下 示例 某些JavaScript引擎(例如,Node.jsIgnition + turbofan之前的Chrome的当前版本和较旧版本)无法在包含try / catch块的函数上运行优化器。 如果您需要处理关键性能代码中的异常

  • 问题内容: 从脚本中,我将这样的查询发送了数千次到本地数据库: 我忘了添加where部分,因此同一列为表中的所有行设置了相同的值,并且完成了数千次,并且对该列建立了索引,因此相应的索引可能更新了太多次。 我注意到出了点问题,因为花了太长时间,所以我杀死了脚本。从那以后,我什至重新启动了计算机,但表中有些东西卡住了,因为简单的查询需要很长时间才能运行,并且当我尝试删除相关索引时,它失败并显示以下消息

  • 我希望能够在后台启动一大批工作,而不使用bash脚本,并继续在同一个内核上工作。这有可能吗?我对架构变化持开放态度,但我的库的最终用户可能不是很复杂。 表示ipython单元 python 3.7。6从JupyterLab内部

  • 我通读了Dart/flatter中的Async/Await/then,试图理解为什么aysnc函数中的Await不会等到完成后再继续。在我的UI中,有一个按钮调用一个异步方法来返回一个位置,该位置总是返回null,并且不等待函数完成。 该函数将调用推送到一个新的UI页面,该页面选择一个位置,并应返回一个结果。如何使该函数等待结果?我不是在使用异步吗?