gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:01:37 26 4
gpt4 key购买 nike

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

我试着阅读这里,但我还是不明白: https://www.codejava.net/java-core/concurrency/java-concurrency-scheduling-tasks-to-execute-after-a-given-delay-or-periodically

public class Main {

public static void main(String[] args) throws ClassNotFoundException {
ScheduledExecutorService executor =
Executors.newSingleThreadScheduledExecutor();
Runnable runnable = new AutoUpdater();
Thread thread = new Thread(runnable, "MyThread");
executor.scheduleAtFixedRate(thread, 0, 24, TimeUnit.HOURS);
}
}

public class AutoUpdater implements Runnable {
public void run() {
String threadName = Thread.currentThread().getName();
System.out.println(threadName + " is running...");
System.out.println("Thread ended.\n");
}
}

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

pool-1-thread-1

它应该是这样的:

pool-1-MyThread-1

最佳答案

问题是 Executors.newSingleThreadScheduledExecutor() 创建了一个内部线程池。

当您查看 ScheduledExecutorService::scheduleAtFixedRate 时需要 Runnable作为第一个参数。而这个 Runnable 将由池中的某个线程运行。注意 Thread实现 Runnable 并将 Thread 实例传递给 scheduleAtFixedRate 方法,这样该线程的 run 方法将被其他线程调用 但线程你通过的将不会开始。通常,为了避免任何误解,您应该在此处传递简单的 Runnable,这将代表需要完成的工作。

如果您想更改此池中的线程名称,您必须提供自定义 ThreadFactory池将使用它来创建新线程:

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

ScheduledExecutorService executor =
Executors.newSingleThreadScheduledExecutor(threadFactory);

编辑:

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

class MyThreadFactory implements ThreadFactory {
@Override
public Thread newThread(Runnable runnable) {
return new Thread(runnable, "MyThreadName");
}
}

然后传递它:

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

关于java - 发送到 scheduleAtFixedRate 时线程名称不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57346260/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com