【问题标题】:Java: Thread.currentThread().getName() returns "NO_THREAD_YET"Java:Thread.currentThread().getName() 返回“NO_THREAD_YET”
【发布时间】:2019-10-13 00:42:40
【问题描述】:

我有一个 web 服务,它在服务启动时运行一个线程池,如下所示:

ExecutorService threadPool = Executors.newFixedThreadPool(30);
threadPool.execute(new WorkerThread());

Workerthread 类如下所示:

    class WorkerThread implements Runnable {

    public WorkerThread () {
    }

    @Override
    public void run() {
        String threadName = Thread.currentThread().getName()
    }
}

问题:有时线程名称是NO_THREAD_YET,我无法弄清楚发生这种情况的情况。我猜ExecutorService 只是没有任何可用的免费威胁,但为什么池不抛出@987654326 @当它已满时,我尝试添加一个新的WorkerThread

如何确保Thread.currentThread().getName() 总是从池中返回有效线程的 ID?

编辑:WorkerThread 类是我自己的实现。这只是一个简化的示例代码,因为我传递给WorkerThread 的其他参数例如String变量与此问题无关。

【问题讨论】:

  • WorkerThread 属于哪个类? JDK不包含这样的
  • 这让我很困惑,因为工作线程不应该运行,直到服务有可用的线程。 minimal reproducible example 可以在这里重现这一点非常好。
  • WorkerThread 是自定义类@AlexSalauyou
  • DefaultThreadFactory 用于Executors 中的线程创建会生成名为 a-la "pool-X-thread-Y" 的线程,除非您使用自定义工厂或手动更改名称。它应该是您代码中某处的.setName("NO_THREAD_YET")。正如@HovercraftFullOfEels 所说,Runnable 在某些线程可用之前不会运行。
  • 而且,与您的看法相反,如果池忙,默认执行程序不会抛出异常,只是默默地排队一个任务。

标签: java multithreading threadpool runnable executorservice


【解决方案1】:

原因很可能是您在代码中的某处手动重命名线程,例如在同一线程池中运行的其他一些任务期间:

@Override
public void run() {
    // ...
    Thread.currentThread().setName("NO_THREAD_YET");
    // ...
}

该任务完成后,线程“返回”到池中,可用于其他任务,并在最终请求时产生这样的输出。

要获取不可修改的线程 ID,请使用 Thread#getId

【讨论】:

  • 不确定为什么 OP 决定删除问题,因为您的答案是正确的。我已经帮助取消删除它。 1+
  • 好的,我发现该应用程序并没有像您所说的那样重命名威胁本身,而是发生了更奇怪的事情。线程名被写入后缀为“NO_THREAD_YET”的数据库中。我什至不明白为什么要这样做,但是我删除了后缀,现在它可以工作了。
猜你喜欢
  • 2014-10-11
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多