当前位置: 首页 > 面试题库 >

一段时间内运行代码的更好方法

微生俊材
2023-03-14
问题内容

我需要在预定义的时间长度内运行一些代码,当时间到时它需要停止。当前,我正在使用TimerTask来允许代码执行一段设定的时间,但这导致代码创建无尽的线程,并且效率很低。有更好的选择吗?

当前代码;

// Calculate the new lines to draw 
            Timer timer3 = new Timer();
            timer3.schedule(new TimerTask(){
                public void run(){
                    ArrayList<String> Coords = new ArrayList<String>();
                    int x = Float.valueOf(lastFour[0]).intValue();
                    int y = Float.valueOf(lastFour[1]).intValue();
                    int x1 = Float.valueOf(lastFour[2]).intValue();
                    int y1 = Float.valueOf(lastFour[3]).intValue();
                    //Could be the wrong way round (x1,y1,x,y)?
                    Coords = CoordFiller.coordFillCalc(x, y, x1, y1);
                    String newCoOrds = "";
                    for (int j = 0; j < Coords.size(); j++)
                    {
                        newCoOrds += Coords.get(j) + " ";
                    }
                    newCoOrds.trim();
                    ClientStorage.storeAmmendedMotion(newCoOrds);

                }

            }
            ,time);

问题答案:

如果您使用的是Java5或更高版本,请考虑ScheduledThreadPoolExecutorFuture。使用前者,您可以安排任务在指定的延迟后或以指定的时间间隔运行,因此,它可以Timer更可靠地接管的角色。

Timer设施管理延迟(“每100毫秒运行一次此任务”)和定期(“每10毫秒运行此任务”)任务的执行。但是,它Timer有一些缺点,ScheduledThreadPoolExecutor应将其视为替代品。[…]

A
Timer仅创建一个用于执行计时器任务的线程。如果计时器任务花费的时间太长,则其他计时器的计时精度TimerTask可能会受到影响。如果TimerTask安排一个重复执行周期为每10毫秒运行一次,而另一个TimerTask重复运行则需要40毫秒运行,则长时间运行的任务完成后,重复执行的任务(取决于是以固定速率还是固定延迟计划)将被快速连续调用四次。
,或完全“缺失”四个调用。计划线程池通过允许您提供多个线程来执行延迟和定期任务来解决此限制。

另一个问题Timer是,如果TimerTask抛出未经检查的异常,它的行为就会很差。该Timer线程不会捕获该异常,因此从a引发的未经检查的异常将TimerTask终止计时器线程。Timer在这种情况下也不会恢复线程;而是错误地认为整个都Timer被取消了。在这种情况下,TimerTask已调度但尚未执行的永远不会运行,并且无法调度新任务。

摘自Java Concurrency inPractice第6.2.5节。

Future小号可以限制运行最多在指定的时间(扔TimeoutException如果不能按时完成)。

更新资料

如果您不喜欢上述内容,则可以使任务衡量其自身的执行时间,如下所示:

int totalTime = 50000; // in nanoseconds
long startTime = System.getNanoTime();
boolean toFinish = false;

while (!toFinish) 
{
    System.out.println("Task!");
    ...
    toFinish = (System.getNanoTime() - startTime >= totalTime);
}


 类似资料:
  • 本文向大家介绍PHP间隔一段时间执行代码的方法,包括了PHP间隔一段时间执行代码的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP间隔一段时间执行代码的方法。分享给大家供大家参考。具体分析如下: PHP如何设置每隔一段时间自动执行某段代码?例如定时生成静态文件之类的,这就需要设置休眠时间,即每隔一段时间程序就会调用某段代码. 代码如下: 希望本文所述对大家的PHP程序设计有所帮助

  • 这是我第一次有机会使用Java 8中的“新”java.time包。 我需要得到总的运行时间,比如:< br> 我知道有2: - ,月和日的 ,分钟,秒,毫秒和纳秒的持续时间 有没有一种方法可以将这两者结合起来,或者比“做数学”更简单的方法? 这是到目前为止我能做的最好的事情:(用新的改进版本更新) 感谢您的宝贵时间=)

  • 编辑:为了澄清一点,我对此表示怀疑,因为通道似乎在做关闭通道的工作,但当然,我不能在任何goroutine中关闭通道,因为所有例程共享同一个通道。因此,我使用来模拟一个进行某种“缓冲关闭”的通道。 Edit2:原始代码实际上并不起作用,因为有时来自例程的信号在它刚刚对执行int之前被读取。需要一个“清理”循环。

  • 本文向大家介绍Python退出时强制运行一段代码的实现方法,包括了Python退出时强制运行一段代码的实现方法的使用技巧和注意事项,需要的朋友参考一下 设想这样一个场景,你要给一个项目开发测试程序,程序开始运行的时候,会创建初始环境,测试完成以后,会清理环境。   这段逻辑本身非常简单: setup() test() clean() 但由于测试的代码比较复杂,你总是在调试的时候程序异常,导致每次c

  • 问题内容: 对于单个项目,我想知道在滚动时间内更改的代码行数。 我们正在使用Jenkins和Java,并且我正在寻找某种Jenkins插件或报告,以根据需要提供报告。 目的是确定发现的错误与更改的代码行数之间是否存在关系,更重要的是,要在不同项目之间进行此比较。 问题答案: 我不确定我是否正确理解您的问题,但这是一个主意: 编写一个脚本,该脚本将列出SCM检出中的更改并创建一个文件。添加构建步骤以

  • 问题内容: 我想运行Java代码一定时间,例如16个小时!我有一个大约运行一个小时的Java代码,我希望它可以重复运行16小时。因此,我有一个用户通过Jenkins传递的参数!我使用访问此值 现在,我想在指定时间后退出执行。因此,假设用户选择了16,脚本应运行16个小时,然后退出。 如图所示,接受来自Jenkins用户的输入 我看到了其他一些问题,但是其中大多数问题与计时器处理的时间不是几秒钟就是