ThreadFactoryBuilder,它更好!


我們程序的日志鏈路追蹤id(trace_id)通常通過線程名(或通過log框架的MDC)來實現。

相較於juc.ThreadFactory來說,hutool、guava均提供了ThreadFactoryBuilder,更方便我們使用。

 

java rt包:JUC下面原生ThreadFactory類

// import java.util.concurrent.ThreadFactory;

private static ExecutorService paymentPool = Executors.newSingleThreadExecutor(new ThreadFactory() { @Override public Thread newThread(@NotNull Runnable r) { return new Thread(r, "Alipay-Msg-Thread"); } });

這種方式創建的線程名都是相同的。不太契合我們記日志的需求。

2022-03-23 12:20:14,019 INFO [Alipay-Msg-Thread] TestMain (TestMain:67) - ddd

 

hutool里的ThreadFactoryBuilder

// import cn.hutool.core.thread.ThreadFactoryBuilder
private static ScheduledExecutorService scheduledThreadPoolExecutor = Executors.newScheduledThreadPool(5, ThreadFactoryBuilder.create().setNamePrefix(PaymentServiceImpl.class.getSimpleName().concat("_")).build());

log效果:

2022-03-23 12:20:14,019 INFO [PaymentServiceImpl_1] TestMain (TestMain:70) - sched2
2022-03-23 12:20:14,019 INFO [PaymentServiceImpl_0] TestMain (TestMain:68) - sched

 

google guava.jar里的ThreadFactoryBuilder

 

// import com.google.common.util.concurrent.ThreadFactoryBuilder

private static ExecutorService paymentPool = Executors.newSingleThreadExecutor( new ThreadFactoryBuilder().setNameFormat("PaymentService_pool_%d").build());

 

log效果:

2022-03-23 12:20:14,019 INFO [PaymentService_pool_1] TestMain (TestMain:67) - ddd
2022-03-23 12:20:14,019 INFO [PaymentService_pool_2] TestMain (TestMain:67) - ddd

 

比較

hutool的ThreadFactoryBuilder提供的api是設置線程名前綴,我們無需關注占位符。

guava的ThreadFactoryBuilder提供的api是format,需考慮占位符。

另外,從建造者模式(Builder Pattern)的角度來說,通常我們在使用時,應先調用實例的create或build方法,這一點,hutool做得稍優秀一些。

相比來說,個人覺得hutool更容易上手使用。

 

你用哪些ThreadFactoryBuilder呢?

歡迎交流!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM