首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >配置12小时后,java.util.concurrent.ScheduledExecutorService.scheduleAtFixedRate每4-5秒调用线程一次。

配置12小时后,java.util.concurrent.ScheduledExecutorService.scheduleAtFixedRate每4-5秒调用线程一次。
EN

Stack Overflow用户
提问于 2022-02-04 12:40:05
回答 1查看 106关注 0票数 0

我有一个单例类,它在创建实例时创建一个线程。只创建该类的一个对象,线程计划每12小时运行一次,并打印给定的语句。在某些情况下,在最初的12h之后,线程每4-5秒被调用一次。我不明白为什么会发生这种情况,因为我已经将调度程序配置为每12小时运行一次,而不是每4-5秒运行一次。是否有我错过的配置,或者调度程序配置错误?

单身阶级,

代码语言:javascript
复制
import java.time.Instant;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;

public class ThreadSchedulerTest {
private static final ThreadSchedulerTest test = new ThreadSchedulerTest();
private ThreadSchedulerTest (){createThread();}

private void createThread() {

        Runnable renewer = () -> {
            System.out.println("Running ok , time is : "+ Instant.now());
        };
        Executors.newSingleThreadScheduledExecutor(new 
 ThreadSchedulerThreadFactory("thread1")).scheduleAtFixedRate(
                renewer, 0, 12, TimeUnit.HOURS);

}
static class ThreadSchedulerThreadFactory implements ThreadFactory {
    private final String name;

    public ThreadSchedulerThreadFactory(final String name) {
        this.name = name;
    }

    @Override
    public Thread newThread(Runnable r) {
        Thread thread = new Thread(r, name);
        thread.setDaemon(true);
        return thread;
    }
}
}

有人能帮忙澄清这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2022-02-04 13:03:13

如果将TimeUnit更改为秒并生成实例的可运行的打印哈希代码,您会发现更容易测试:

代码语言:javascript
复制
Runnable renewer = () -> {
    System.out.println("Running ok instance="+ThreadSchedulerTest.this.hashCode()+", time is : "+ Instant.now());
};

每4-5秒重复一次的问题可能是您已经创建了两个ThreadSchedulerTest实例。上述消息修复将确认。

您提供的代码不会运行,因为您有构造函数和成员变量的递归定义。因此,ThreadSchedulerTest的每个实例都执行第二个构造函数ThreadSchedulerTest test = new ThreadSchedulerTest();,然后实例化一个新成员test

代码语言:javascript
复制
new ThreadSchedulerTest()
|  Exception java.lang.StackOverflowError
|        at ThreadSchedulerTest.<init> (#5:2)

您可以修正我的声明-- test是静态的,构造函数是私有的,因此只构造了一个实例:

代码语言:javascript
复制
public class ThreadSchedulerTest {
   static final ThreadSchedulerTest test = new ThreadSchedulerTest();
   private ThreadSchedulerTest () {
        createThread(); 
   }
   ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70986544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档