如何在basicthreadfactory中使用名称模式?

0lvr5msh  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(730)

我正在开发一个多线程应用程序,它从多个源读取数据,进行一些计算,并将结果写入多个输出。我有几个读者线程,几个计算线程和几个作家。配置中给出了每种类型的线程数。我想把这些线程相应地命名为:“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”和它到线程工厂的序列号。如果有人能给我一个提示,我将不胜感激。

ykejflvf

ykejflvf1#

如果你真的想设置 Thread 执行提交的 Callable / Runnable 把名字给我就行了 Callable / Runnable 让它来设定 Thread 只要打个电话就可以了 Thread.currentThread().setName(...) ,即:

public class BatchFileReader implements Runnable {
    private final String name;

    public BatchFileReader(final String name /*, other arguments go here...*/) {
        this.name = Objects.requireNonNull(name);
    }

    @Override
    public void run() {
        Thread.currentThread().setName(name);
        //Do your work here...
    }
}

我希望这是独立于任何工作 Executor 实现,假设每个 Thread 一次只能运行一个给定的任务,据我所知确实如此。如果一个人 Thread 可以运行多个 Callable / Runnable 在(伪)并行的时候,这种方法就行不通了。
我还研究了对每个提供的 Executor 但那会更痛苦。至少在 ThreadPoolExecutor 您可以通过将其子类化并重写 ThreadPoolExecutor#beforeExecute 两者都有 AbstractExecutorService#newTaskFor 方法以防您使用 submit 提交方法 Callable s码/ Runnable s。如果你只是在使用 execute 为了一个 Runnable 那么你只需要重写 ThreadPoolExecutor#beforeExecute . 但你还是得保留一个 Runnable 的名称(以便您可以将其传递给 ThreadThreadPoolExecutor#beforeExecute ).
我注意到的另一个问题是,如果你真的必须依赖 Thread 是为了他们的名字。。。我是说如果你只是和 Callable s码/ Runnable 在他们的 call / run 方法,那么为什么不简单地为它们提供名称,就这样?我的意思是我根本不知道你为什么要给我一个名字 Thread 不管怎样,当你只和他们互动的时候 Callable s码/ Runnable s(假设您正在这样做)。据我所知,您可以为名称提供一个访问器方法(即 getName )在你的 BatchFileReader 实现。

相关问题