线程池之线程工厂

参考:https://blog.csdn.net/weixin_52962125/article/details/130556400?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7EPosition-2-130556400-blog-125580159.235%5Ev38%5Epc_relevant_sort&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7EPosition-2-130556400-blog-125580159.235%5Ev38%5Epc_relevant_sort&utm_relevant_index=5

定义自己的线程工厂,方便问题排查,指定线程前缀

public class IotThreadFactory implements ThreadFactory {
 
    public static IotThreadFactory create(String namePrefix) {
        return new IotThreadFactory(namePrefix);
    }
 
    private final AtomicInteger poolNumber = new AtomicInteger(1);
 
    private final ThreadGroup group;
 
    private final AtomicInteger threadNumber = new AtomicInteger(1);
 
    private final String namePrefix;
 
    private IotThreadFactory(String namePrefix) {
        SecurityManager s = System.getSecurityManager();
        group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();
        this.namePrefix = namePrefix + " pool " + poolNumber.getAndIncrement() + "-thread-";
    }
 
    @Override
    public Thread newThread(Runnable r) {
        Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0);
        if (t.isDaemon()) {
            t.setDaemon(false);
        }
        if (t.getPriority() != Thread.NORM_PRIORITY) {
            t.setPriority(Thread.NORM_PRIORITY);
        }
        return t;
    }
 
}

使用线程池进行日志入库

@Slf4j
@Service
public class LogService {
 
    private ThreadPoolExecutor threadPoolExecutor;
 
    @Autowired
    private OperateLogDao operateLogDao;
 
    @Autowired
    private LoginLogDao loginLogDao;
 
    @PostConstruct
    void init() {
        if (threadPoolExecutor == null) {
            threadPoolExecutor = new ThreadPoolExecutor(3, 10, 30L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(2000), IotThreadFactory.create("LogAspect"));
        }
    }
 
    @PreDestroy
    void destroy() {
        if (threadPoolExecutor != null) {
            threadPoolExecutor.shutdown();
            threadPoolExecutor = null;
        }
    }
 
    public void addLog(Object object) {
        try {
            if (object instanceof UserLoginLogEntity) {
                threadPoolExecutor.execute(() -> loginLogDao.insert((LoginLogEntity) object));
            }
            if (object instanceof OperateLogEntity) {                
                threadPoolExecutor.execute(() -> operateLogDao.insert((OperateLogEntity) object));
            }
            
        } catch (Throwable e) {
            log.error("=====> LogService#addOperateLog logAfterAdvice: {}", e.getMessage());
        }
    }
}

 

posted @   huigui_mint  阅读(78)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示