面试题答案
一键面试实现定制线程工厂的关键步骤
- 创建一个实现
ThreadFactory
接口的类:ThreadFactory
接口只有一个newThread
方法,用于创建新线程。 - 在
newThread
方法中:为新创建的线程设置特定的前缀名称。
核心代码示例
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;
public class CustomThreadFactory implements ThreadFactory {
private final String prefix;
private final AtomicInteger threadNumber = new AtomicInteger(1);
public CustomThreadFactory(String prefix) {
this.prefix = prefix;
}
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r, prefix + "-thread-" + threadNumber.getAndIncrement());
System.out.println("Created thread: " + t.getName());
return t;
}
}
使用示例:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) {
CustomThreadFactory factory = new CustomThreadFactory("MyApp");
ExecutorService executorService = Executors.newFixedThreadPool(3, factory);
for (int i = 0; i < 5; i++) {
executorService.submit(() -> {
System.out.println(Thread.currentThread().getName() + " is running.");
});
}
executorService.shutdown();
}
}
定制线程工厂时需要特别注意的问题
- 线程命名规则:确保前缀名称和后续编号等规则清晰,便于在日志追踪时准确识别线程所属的业务模块或功能。
- 异常处理:在
newThread
方法中,虽然通常不需要复杂的异常处理,但如果创建线程过程中可能抛出异常(例如资源不足等情况),要考虑如何恰当处理。 - 线程属性设置:除了设置名称,还可能需要设置线程的优先级、是否为守护线程等属性,应根据实际需求合理设置,避免对线程行为产生不良影响。
- 线程安全:如果线程工厂中有共享状态(如示例中的
AtomicInteger
),要确保其线程安全性,避免多线程访问时出现数据竞争问题。