Java 发送到scheduleAtFixedRate时线程名称不匹配

Java 发送到scheduleAtFixedRate时线程名称不匹配,java,threadpool,Java,Threadpool,我创建了一个可运行的类并创建了一个线程,但它的名称是唯一的,但当我通过executor.scheduleAtFixedRate发送这个线程时,它会创建自己的线程,我不明白为什么会这样 我试图在这里阅读,但仍然不明白: 它应该打印名称MyThread,但输出为: pool-1-thread-1 也许应该是这样的: pool-1-MyThread-1 executor服务正在为您创建它。 如果希望覆盖线程的命名,可以在executor服务中设置选项。 请参见问题在于Executors.newS

我创建了一个可运行的类并创建了一个线程,但它的名称是唯一的,但当我通过executor.scheduleAtFixedRate发送这个线程时,它会创建自己的线程,我不明白为什么会这样

我试图在这里阅读,但仍然不明白:

它应该打印名称MyThread,但输出为:

pool-1-thread-1
也许应该是这样的:

pool-1-MyThread-1

executor服务正在为您创建它。 如果希望覆盖线程的命名,可以在executor服务中设置选项。
请参见问题在于
Executors.newSingleThreadScheduledExecutor()
创建了一个内部有自己线程的池

当你看它时,它作为第一个论点。这个
Runnable
将由池中的某个线程运行。请注意,实现了
Runnable
,您将
线程
实例传递给
scheduleAtFixedRate
方法,因此此线程的run方法将被其他线程调用,但传递的线程不会启动。一般来说,为了避免任何误解,您应该在此处传递simple
Runnable
,它将表示需要完成的工作

如果要更改此池中线程的名称,则必须提供自定义名称,该名称将由池用于创建新线程:

ThreadFactory threadFactory = runnable -> new Thread(runnable, "MyThreadName");

ScheduledExecutorService executor =
            Executors.newSingleThreadScheduledExecutor(threadFactory);
编辑

对于<8的Java版本,我们可以简单地创建实现
ThreadFactory
接口的新类:

class MyThreadFactory implements ThreadFactory {
    @Override
    public Thread newThread(Runnable runnable) {
        return new Thread(runnable, "MyThreadName");
    }
}
然后通过它:

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(new MyThreadFactory());

调度程序有自己的线程用于执行任务。您的线程对象只是提供要运行的代码,而不是名称。我可以更改调度程序自己的线程名称吗?送一份遗嘱执行人是对的吗?也许应该是executor.scheduleAtFixedRate(runnable,0,24,TimeUnit.HOURS)??发送遗嘱执行人是正确的吗?也许应该是executor.scheduleAtFixedRate(runnable,0,24,TimeUnit.HOURS)??您能解释一下如何创建这个ThreadFactory-ThreadFactory=runnable->new-Thread(runnable,“MyThreadName”)?您使用的是什么Java版本?我使用的是Java版本8,所以上面的代码应该适合您。你说的“如何创建”是什么意思?没关系,我知道了,你的编辑帮助我把它做好了
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(new MyThreadFactory());