Java 基于ThreadFactory可运行输入的实例类型,为ExecutorService ScheduledExecutorService实现自定义命名

Java 基于ThreadFactory可运行输入的实例类型,为ExecutorService ScheduledExecutorService实现自定义命名,java,threadpoolexecutor,scheduledexecutorservice,managedthreadfactory,Java,Threadpoolexecutor,Scheduledexecutorservice,Managedthreadfactory,我有一个ExecutorService和ScheduledExecutorService,我正在为它使用自定义ThreadFactory,这样我就可以根据runnable输入到线程工厂的类型来命名每个线程,以便创建线程,但是runnable到ThreadFactory的输入类型为ThreadPoolExecutor$Worker。以下是我的ThreadFactory实现。如何从ExecutorService和ScheduledExecutorService获取实际的runnable以创建线程 收

我有一个
ExecutorService
ScheduledExecutorService
,我正在为它使用自定义
ThreadFactory
,这样我就可以根据
runnable
输入到线程工厂的类型来命名每个线程,以便创建线程,但是
runnable
ThreadFactory
的输入类型为
ThreadPoolExecutor$Worker
。以下是我的
ThreadFactory
实现。如何从
ExecutorService
ScheduledExecutorService
获取实际的
runnable
以创建线程

收单机构交易
发卡机构交易
实现
可运行

private final ThreadFactory               threadFactory = new CustomThreadFactory(config.bankId, config);
private final ScheduledThreadPoolExecutor schedular     = new ScheduledThreadPoolExecutor(5, threadFactory);
private final ThreadPoolExecutor          executor      = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), threadFactory);


public final class CustomThreadFactory implements ThreadFactory {
    private final String     prefix;
    private final CoreConfig config;
    private AtomicInteger    counter = new AtomicInteger(0);

    public CustomThreadFactory(final String prefix, final CoreConfig config) {
        this.prefix = prefix;
        this.config = config;
    }

    //@formatter:off
    @Override
    public final Thread newThread(Runnable runnable) {
        if(runnable instanceof Scheduled) return new Thread(runnable, getName(prefix, "sch", counter.getAndIncrement()));
        else if (runnable instanceof AcquirerTransaction || runnable instanceof NoLogAcquirerTransaction) return new Thread(runnable, getName(prefix, "acq", counter.getAndIncrement()));
        else if (runnable instanceof IssuerTransaction || runnable instanceof NoLogIssuerTransaction) return new Thread(runnable, getName(prefix, "iss", counter.getAndIncrement()));
        else return new Thread(runnable, getName(prefix, "gen", counter.getAndIncrement()));
    }

    private static final String getName(final String prefix, final String type, final int count) {
        return prefix + "-" + type + "-" + count;
    }


    public final String getPrefix() {
        return prefix;
    }
}
private final ThreadFactory ThreadFactory=new CustomThreadFactory(config.bankId,config);
private final ScheduledThreadPoolExecutor schedular=新ScheduledThreadPoolExecutor(5,threadFactory);
private final ThreadPoolExecutor executor=新的ThreadPoolExecutor(0,Integer.MAX_值,60L,TimeUnit.SECONDS,new SynchronousQueue(),threadFactory);
公共最终类CustomThreadFactory实现ThreadFactory{
私有最终字符串前缀;
私有最终CoreConfig配置;
私有AtomicInteger计数器=新的AtomicInteger(0);
公共CustomThreadFactory(最终字符串前缀,最终CoreConfig配置){
this.prefix=前缀;
this.config=config;
}
//@格式化程序:关闭
@凌驾
公共最终线程newThread(Runnable Runnable){
if(runnable instanceof Scheduled)返回新线程(runnable,getName(前缀,“sch”,counter.getAndIncrement());
else if(收单机构事务的可运行实例| | NoLogAcquirerTransaction的可运行实例)返回新线程(可运行,getName(前缀“acq”,counter.getAndIncrement());
else if(IssuerTransaction的runnable instanceof IssuerTransaction | | nologicsuertransaction的runnable instanceof nologicsuertransaction)返回新线程(runnable,getName(前缀,“iss”,counter.getAndIncrement());
否则返回新线程(runnable,getName(前缀“gen”,counter.getAndIncrement());
}
私有静态最终字符串getName(最终字符串前缀、最终字符串类型、最终整数计数){
返回前缀+“-”+类型+“-”+计数;
}
公共最终字符串getPrefix(){
返回前缀;
}
}

您可以在可运行执行开始时设置当前线程的名称,并在结束时清除它。使用静态curentThread方法,然后使用setName方法获取ADAN。

什么是
收单机构交易
发卡机构交易
等等?它们是否将
Runnable
作为超类型?@michalk是。我已经相应地更新了这个问题。这些类的目的不是重用线程吗?这意味着您不会为每个runnable创建新线程。这可能是解决我问题的唯一方法。