在Java中运行代码x秒?

     2023-03-15     74

关键词:

【中文标题】在Java中运行代码x秒?【英文标题】:Run code for x seconds in Java? 【发布时间】:2011-01-03 00:01:50 【问题描述】:

我想编写一个 java while 循环,它将迭代 15 秒。我认为这样做的一种方法是存储当前系统时间 + 15 秒,然后将其与 while 循环签名中的当前时间进行比较。

有没有更好的办法?

【问题讨论】:

您需要在 15 秒内完成任何工作还是等待? 【参考方案1】:

这个设计取决于你想在 15 秒内做什么。两种最合理的情况是“每隔 X 执行一次,持续 15 秒”或“等待 X 发生或等待 15 秒,以较早发生者为准”,这将导致非常不同的代码。

等待

Thread.sleep(15000)

这不会迭代,但是如果你想在 15 秒内什么都不做会更有效(它会在什么都不做时浪费更少的 CPU)。

重复一些代码 15 秒

如果您真的想循环 15 秒,那么您的解决方案很好,只要您的代码不会花费太长时间。比如:

long t= System.currentTimeMillis();
long end = t+15000;
while(System.currentTimeMillis() < end) 
  // do something
  // pause to avoid churning
  Thread.sleep( xxx );

等待 15 秒或其他条件

如果您希望代码在 15 秒后被中断,无论它在做什么,您都需要一个多线程解决方案。查看java.util.concurrent 以获得许多有用的对象。大多数锁定方法(如 wait() )都有一个超时参数。 semaphore 可能完全符合您的需要。

【讨论】:

他很可能希望线程做某事 15 秒,所以睡觉会适得其反。 这个例子对我没有帮助,因为我想在多个线程中执行这段代码。如果你想查看我的解决方案到这个页面。【参考方案2】:

正如其他发帖者已经提到的,如果您只想让帖子暂停一段时间,请使用Thread.sleep()

如果你想让线程做某事,但想让它在一段时间后停止,使用类似的东西:

class Foo implements Runnable 
    private volatile boolean killed = false;

    public void run() 
        while (!killed) 
            try  doOnce();  catch (InterruptedException ex)  killed = true; 
        
    

    public void kill()  killed = true; 
    private void doOnce() throws InterruptedException  /* .. */ 

然后从主线程执行:

Foo foo = new Foo(); 
Thread thread = new Thread(foo);
thread.start();

/* when you want to stop it */
foo.kill();
thread.interrupt();

【讨论】:

不要忽略 InterruptedException。如果某事想要打断,就打断它(至少退出循环)。 @Carlos 谢谢!我编辑了代码以在中断时退出循环。【参考方案3】:

虽然您可能想查看当前时间是否大于您要停止的点,但您的一般方法似乎很好,否则您可能会运行很长时间。

另一种方法是运行一个计时器/线程,在 15 秒后设置一个标志。这个标志必须被标记为 volatile 否则你的循环可能看不到值的变化。

如果您关心效率,选择哪个更昂贵,每个循环获取一次系统时间还是访问 volatile 变量?我不知道哪个更有效 - 如果它真的很重要,您可以对其进行基准测试。

对于简单、可维护的代码,我会选择计时器检查方法:

long endTime = System.currentTimeMillis() + 15000
while (System.currentTimeMillis() < endTime) 
  //loop
 

【讨论】:

【参考方案4】:

试试这个:

public class SleepMessages 
    public static void main(String args[]) throws InterruptedException 
        String importantInfo[] = 
            "Mares eat oats",
            "Does eat oats",
            "Little lambs eat ivy",
            "A kid will eat ivy too"
        ;

        for (int i = 0; i < importantInfo.length; i++) 
            //Pause for 15 seconds
            Thread.sleep(15000);
            //Print a message
            System.out.println(importantInfo[i]);
        
    

更多信息:here

【讨论】:

【参考方案5】:

永远不要在一个紧密的循环中检查当前时间。

否则,使用笔记本电脑的人可能会因 CPU 过热而烧毁他/她的膝盖。我听说过这种真实发生的故事。

【讨论】:

有趣 - 每次内核滴答声都会更新计时器值,因此计时器操作虽然不是免费的,但应该很便宜。在紧密循环中执行任何操作都会使 CPU 升温。【参考方案6】:

您可以使用 AOP 和来自 jcabi-aspects 的 @Timeable 注释(我是开发人员):

@Timeable(limit = 1, unit = TimeUnit.SECONDS)
String load(String resource) 
  // do this check regularly:
  if (Thread.currentThread.isInterrupted()) 
    throw new IllegalStateException("time out");
  
  // execution as normal

当达到时间限制时,您的线程会将interrupted() 标志设置为true,您的工作是正确处理这种情况并停止执行。

【讨论】:

【参考方案7】:

假设您希望循环执行一些明智的操作,您可能会发现检查 volatile 标志会更快。让另一个线程等待 15 秒(或使用计时器)然后设置它。

或者,如果您大致知道循环体将花费多长时间,例如运行几百次,然后在外部循环中进行时间检查。

final long start = System.nanoTime();
do 
    for (int i=0; i<200, ++i) 
        ...
    
 while (System.nanoTime()-start < 15L*1000L*1000L*1000L);

System.nanoTime 不应该被系统时钟的变化弄糊涂了。使用长字面数字很重要。

【讨论】:

【参考方案8】:

您可能对调度一个停止另一个线程或更改循环条件的 TimerTask 感兴趣。

【讨论】:

【参考方案9】:

对于java.util.concurrent 方法,请参阅Chapter 6 of Java Concurrency in Practice(第 6.3.7 节对任务设置时间限制,第 131 页)。

代码示例:Fetching an advertisement with a time budget.

【讨论】:

【参考方案10】:

类似于@Tom Hawtin 的解决方案,没有任意循环大小。

final long end = System.nanoTime() + 15 * 1000 * 1000 * 1000L;
int loop = 1;
do 
    for (int i=0; i<loop; ++i) 
        ...
    
    loop++;
 while (System.nanoTime() < end);

在这种情况下,内部循环的大小将开始很小,但如果循环特别快,则大小会增加。如果它足够慢,它可能只迭代一次。

【讨论】:

【参考方案11】:

这是我的建议,它对我很有用:)

StoppingTime = 15 ;
int loop = 1;
long StartTime = System.currentTimeMillis() / 1000 ;
for (int i=0; i<loop; ++i) 
    // your code here

    loop++;
    if (((System.currentTimeMillis()/1000) - StartTime) > StoppingTime)
        loop=0;

【讨论】:

【参考方案12】:

我建议你使用计时器类来避免 Thread.sleep(xxx);方法。

例如:

import java.util.Timer;
import java.util.TimerTask;

public class TimerExample 
    private int globalTimer = 0;
    private int limitTimer = 15;

    public static void main(String[] args) 
        new TimerExample();
    

    public TimerExample() 
        Timer timer = new Timer();
        timer.schedule(new TimerTask() 
            @Override
            public void run() 
                globalTimer++;
                // DO YOUR CODE HERE
                System.out.println("running");
                if (globalTimer == limitTimer) 
                    timer.cancel();
                
            
        , 0, 1000);
    

【讨论】:

如何在 Java 中每天在设定的时间运行代码? [复制]

】如何在Java中每天在设定的时间运行代码?[复制]【英文标题】:HowdoIruncodeatasettimeeverydayinJava?[duplicate]【发布时间】:2021-05-2822:51:25【问题描述】:目前正在研究某种算法,我需要每天在同一时间运行代码。我试过创建一个计... 查看详情

java示例代码_将毫秒转换为";X分,X秒和#34;在爪哇

java示例代码_将毫秒转换为";X分,X秒和#34;在爪哇 查看详情

目标 c - 运行代码块 X 秒,但如果条件满足则立即返回

】目标c-运行代码块X秒,但如果条件满足则立即返回【英文标题】:Objectivec-RunblockofcodeforXsecondsbutreturnimmediatelyifconditionsatisfies【发布时间】:2013-08-0721:29:22【问题描述】:所以情况是我需要运行代码5秒,但如果我符合条件,则... 查看详情

如何在 Java 中将毫秒转换为“X 分钟,x 秒”?

】如何在Java中将毫秒转换为“X分钟,x秒”?【英文标题】:HowtoconvertMillisecondsto"Xmins,xseconds"inJava?【发布时间】:2010-10-1203:28:36【问题描述】:我想使用System.currentTimeMillis()记录用户在我的程序中开始某事的时间。当他... 查看详情

如何在android中运行一些代码20秒

】如何在android中运行一些代码20秒【英文标题】:Howtorunsomecodefor20secondsinandroid【发布时间】:2011-06-1600:44:30【问题描述】:我想精确地运行一些代码20秒。它类似于循环,但没有变量,我有时间(以秒为单位)。我应该有这样的... 查看详情

Xamarin Forms:即使应用程序在后台,如何每 x 秒运行一次服务?

】XamarinForms:即使应用程序在后台,如何每x秒运行一次服务?【英文标题】:XamarinForms:Howtorunaserviceeveryxsecondseventheappisinbackground?【发布时间】:2020-10-2714:24:06【问题描述】:我使用以下代码每10秒调用一次函数。varstartTimeSpan=Tim... 查看详情

运行中断/定时器 x 秒?

】运行中断/定时器x秒?【英文标题】:Runaninterrupt/timerforxamountofseconds?【发布时间】:2012-10-1603:03:30【问题描述】:我正在学习在我的SiliconLaboratoriesC8051F020toolstick子卡包上使用中断。我想在指定的时间内运行中断。谁能给我一... 查看详情

如果运行超过 x 秒,SQL 查询返回一个值?

】如果运行超过x秒,SQL查询返回一个值?【英文标题】:SQLQueryreturnavalueifrunningmorethanxseconds?【发布时间】:2017-02-0110:18:05【问题描述】:如果SQL查询运行时间超过X秒,是否可以终止正在执行的查询并返回特定值(例如returnvalue=... 查看详情

如何每 X 秒运行一次方法

】如何每X秒运行一次方法【英文标题】:HowtorunamethodeveryXseconds【发布时间】:2012-07-1103:41:33【问题描述】:我正在开发一个Android2.3.3应用程序,我需要每X秒运行一个方法。在iOS中,我有NSTimer,但在Android中我不知道该使用什么... 查看详情

我想在一个线程python中每x秒运行一个函数[重复]

】我想在一个线程python中每x秒运行一个函数[重复]【英文标题】:Iwanttorunafunctioneveryxsecinonethreadpython[duplicate]【发布时间】:2017-07-0719:51:42【问题描述】:我想每x秒运行一次函数,并且除非被中断,否则永远不会结束。使用thread... 查看详情

如何让r执行暂停,休眠,等待x秒?(代码片段)

...的是用于自定时动画。所需的解决方案无需用户输入即可运行。答案见help(Sys.sleep)。例如,来自?Sys.sleeptestit<-function(x)p1<-proc.time()Sys.sleep(x)proc.time()-p1#Thecpuusageshouldbenegligibletestit(3.7)生产>testit(3.7)usersystemelapsed0.0000.0003.704另... 查看详情

c# 每 x 秒运行一次数据库任务

】c#每x秒运行一次数据库任务【英文标题】:c#runadatabasetaskeveryxseconds【发布时间】:2019-03-0904:51:40【问题描述】:我想运行一个任务来查询数据库以获取用户的新消息。我希望任务每隔x秒运行一次,以新的方式运行,这样它就... 查看详情

java示例代码_Java如何在时间戳中添加秒数

java示例代码_Java如何在时间戳中添加秒数 查看详情

java:在特定秒数后运行函数

】java:在特定秒数后运行函数【英文标题】:java:runafunctionafteraspecificnumberofseconds【发布时间】:2011-01-1612:22:24【问题描述】:我有一个特定的功能,我想在5秒后执行。我如何在Java中做到这一点?我找到了javax.swing.timer,但我真... 查看详情

java示例代码_在java中,将度数分钟秒转换为十进制

java示例代码_在java中,将度数分钟秒转换为十进制 查看详情

为什么(我的)java比c++快25倍?(代码片段)

...较时,我正在玩Java中的一些FizzBu​​zz代码。我在Java中运行下面的代码,在C++中基本上使用相同的代码。JavaEclipseIDE运行时:11秒C++代码阻止IDE运行时:202秒(比Java慢大约18倍)C++VisualStudioIDE运行时:281秒(比Java慢大约25倍)据... 查看详情

javascriptlance灯箱在x秒后加载(代码片段)

查看详情

java示例代码_在Java中,将历元后的秒数转换为小时/分钟/秒

java示例代码_在Java中,将历元后的秒数转换为小时/分钟/秒 查看详情