我的Java组件中有以下代码.每隔5秒计时器间隔调用一次方法myLongRunningTask(). 我需要能够暂停计时器,直到myLongRunningTask()方法执行完成.想知道这是否可能吗? 如有任何 idea ,我们将不胜感激! (我try 使用Timer.Cancel,但我相信它会丢弃所有当前计划的任务.)

谢谢.

    Timer timer = new Timer();
    TimerTask timerTask = new TimerTask() {
    
    @Override
    public void run() {
        myLongRunningTask();    
    }
  };
    
    timer.schedule(timerTask, 2 * 1000, 5 * 1000);

推荐答案

TimerTimerTask类是遗留的,早在Java 5中就被Executors框架取代了.

Executor个子接口中有一个是ScheduledExecutorService.您可以使用它来计划重复任务.在如何制定重复的时间表方面,您有两个 Select :

您似乎希望:在一个执行结束后,等待五秒钟,直到下一个执行开始.如果你对问题的解释是正确的,你想要上面的第二种方法.

ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor() ;
ses.scheduleWithFixedDelay( myRunnableTask, … , 5 , TimeUnit.SECONDS );

要更多地了解Executor服务,尤其是了解(A)不让异常冒泡和(B)在应用程序结束之前正确关闭它们有多么重要,请搜索Stack Overflow.这个话题已经被谈过很多次了.


Caveat:如果您的应用程序部署到支持Jakarta Concurrency的兼容Jakarta EE的服务器上,请使用managed scheduled executor service,而不是上面所示的代码.

Java相关问答推荐

Annotation @ Memphier无法正常工作,并表示:class需要一个bean,但找到了2个bean:

如何粘合(合并)文件Lucene?

Java List with all combinations of 8 booleans

Java .类参数不通过构造函数传递

我需要生成一个文件来整合每个特性执行的所有JSON结果

如何创建同一类的另一个对象,该对象位于变量中?

蒙蒂霍尔比赛结果不正确

GSON期间的Java类型擦除

有没有更快的方法在N个容器中删除重复项?

SonarLint:只能有条件地调用方法(S)

在执行流和相关操作时,使用Java泛型为2个方法执行相同的操作,但对象不同

扩展视图高度,并将其拖动到较低的视图上,而不是将其向下推?

协同 routine 似乎并不比JVM线程占用更少的资源

JPA无手术同品种器械可能吗?

如何修复Spring Boot应用程序中的RestDocumentationGenerationException:java.io.FileNotFoundException:/curl-request.adoc(只读文件系统)?

升级版本后出现非法访问错误

将@Transactional添加到Spring框架中链下的每个方法会产生什么效果?

Java方法参数:括号中的类型声明?

Java中计算大n和k值模10^9+7的二项式系数的乘法公式输出错误值

Swagger.io OpenApi v3.0 声明默认媒体类型