我有一个单例类,它在创建实例时创建一个线程。只创建该类的一个对象,线程计划每12小时运行一次,并打印给定的语句。在某些情况下,在最初的12h之后,线程每4-5秒被调用一次。我不明白为什么会发生这种情况,因为我已经将调度程序配置为每12小时运行一次,而不是每4-5秒运行一次。是否有我错过的配置,或者调度程序配置错误?
单身阶级,
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;
}
}
}有人能帮忙澄清这个问题吗?
发布于 2022-02-04 13:03:13
如果将TimeUnit更改为秒并生成实例的可运行的打印哈希代码,您会发现更容易测试:
Runnable renewer = () -> {
System.out.println("Running ok instance="+ThreadSchedulerTest.this.hashCode()+", time is : "+ Instant.now());
};每4-5秒重复一次的问题可能是您已经创建了两个ThreadSchedulerTest实例。上述消息修复将确认。
您提供的代码不会运行,因为您有构造函数和成员变量的递归定义。因此,ThreadSchedulerTest的每个实例都执行第二个构造函数ThreadSchedulerTest test = new ThreadSchedulerTest();,然后实例化一个新成员test。
new ThreadSchedulerTest()
| Exception java.lang.StackOverflowError
| at ThreadSchedulerTest.<init> (#5:2)您可以修正我的声明-- test是静态的,构造函数是私有的,因此只构造了一个实例:
public class ThreadSchedulerTest {
static final ThreadSchedulerTest test = new ThreadSchedulerTest();
private ThreadSchedulerTest () {
createThread();
}
...https://stackoverflow.com/questions/70986544
复制相似问题