我正在开发一个多线程应用程序,它从多个源读取数据,进行一些计算,并将结果写入多个输出。我有几个读者线程,几个计算线程和几个作家。配置中给出了每种类型的线程数。我想把这些线程相应地命名为:“reader-1”、“reader-2”、“writer-1”等。
因此,我想使用org.apache.commons.lang3.concurrent.basicthreadfactory来实现这个目的。我确实编写了以下代码:
BasicThreadFactory threadFactory = new BasicThreadFactory.Builder()
.namingPattern("%s-%d")
.daemon(false)
.priority(Thread.MAX_PRIORITY)
.build();
ExecutorService executors = Executors.newFixedThreadPool(config.getPoolSize(), threadFactory);
但是,我找不到在提交时如何指定工作线程的名称和编号。我搜索了上百个链接,却没有看到一个我该怎么做的例子。我正在创建我的可调用
Callable reader = new BatchFileReader(config);
for(int i = 1; i <= maxReaders; i++) {
executors.submit(reader);
}
submit方法没有任何其他参数,除了可运行/可调用的示例。我不知道在哪里可以指定字符串“reader”和它到线程工厂的序列号。如果有人能给我一个提示,我将不胜感激。
1条答案
按热度按时间ykejflvf1#
如果你真的想设置
Thread
执行提交的Callable
/Runnable
把名字给我就行了Callable
/Runnable
让它来设定Thread
只要打个电话就可以了Thread.currentThread().setName(...)
,即:我希望这是独立于任何工作
Executor
实现,假设每个Thread
一次只能运行一个给定的任务,据我所知确实如此。如果一个人Thread
可以运行多个Callable
/Runnable
在(伪)并行的时候,这种方法就行不通了。我还研究了对每个提供的
Executor
但那会更痛苦。至少在ThreadPoolExecutor
您可以通过将其子类化并重写ThreadPoolExecutor#beforeExecute
两者都有AbstractExecutorService#newTaskFor
方法以防您使用submit
提交方法Callable
s码/Runnable
s。如果你只是在使用execute
为了一个Runnable
那么你只需要重写ThreadPoolExecutor#beforeExecute
. 但你还是得保留一个Runnable
的名称(以便您可以将其传递给Thread
在ThreadPoolExecutor#beforeExecute
).我注意到的另一个问题是,如果你真的必须依赖
Thread
是为了他们的名字。。。我是说如果你只是和Callable
s码/Runnable
在他们的call
/run
方法,那么为什么不简单地为它们提供名称,就这样?我的意思是我根本不知道你为什么要给我一个名字Thread
不管怎样,当你只和他们互动的时候Callable
s码/Runnable
s(假设您正在这样做)。据我所知,您可以为名称提供一个访问器方法(即getName
)在你的BatchFileReader
实现。