【发布时间】: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