我有一个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
变量与此问题无关。
答案 0 :(得分:2)
原因很可能是您在代码中的某处手动重命名了一个线程,例如在同一线程池中运行的其他一些任务期间:
@Override
public void run() {
// ...
Thread.currentThread().setName("NO_THREAD_YET");
// ...
}
该任务完成后,线程“返回”到池中,以供其他任务使用,并在最终请求时产生这样的输出。
要获取不可修改的线程ID,请使用Thread#getId