我有一个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只是没有任何可用的免费威胁,但是为什么池不抛出Exception呢?已满,我尝试添加新的WorkerThread吗?

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

编辑:类WorkerThread是我自己的实现。这只是简化的示例代码,因为我将其他参数传递给WorkerThread例如。 String变量未连接到此问题。

最佳答案

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

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


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

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

关于java - Java:Thread.currentThread()。getName()返回“NO_THREAD_YET”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56326069/

10-10 00:51