ThreadFactory 在 Java 中的用法

2022-08-31 17:09:46

有人可以简要解释一下如何使用和何时使用ThreadFactory吗?使用和不使用 ThreadFactory 的示例可能对理解差异非常有帮助。

谢谢!


答案 1

以下是一种可能的用法:

假设您有一个以多线程方式执行任务的函数,并且偶尔会有一个线程因未捕获的异常而死亡。我们还假设您要记录所有这些异常。 通过允许您为线程正在执行的未捕获异常定义统一记录器来解决此问题:ExecutorServiceRunnableThreadFactoryRunnable

ExecutorService executor = Executors.newSingleThreadExecutor(new LoggingThreadFactory());

executor.submit(new Runnable() {
   @Override
   public void run() {
      someObject.someMethodThatThrowsRuntimeException();
   }
});

LoggingThreadFactory可以像这样实现:

public class LoggingThreadFactory implements ThreadFactory
{

    @Override
    public Thread newThread(Runnable r)
    {
        Thread t = new Thread(r);

        t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
        {
            @Override
            public void uncaughtException(Thread t, Throwable e)
            {
                LoggerFactory.getLogger(t.getName()).error(e.getMessage(), e);
            }
        });

        return t;
    }
}

该接口是一个灵活的接口,允许程序员处理未捕获的异常,如上所示,但也允许更好地控制一个的创建细节(如为线程名称定义模式),使其对于调试目的和生产环境非常有用。ThreadFactoryThread


答案 2

工厂模式是软件开发中使用的一种创建设计模式,用于封装创建对象所涉及的过程。

让我们假设我们有一些用于不同任务的工作线程,并希望它们具有特殊名称(例如用于调试目的)。所以我们可以实现一个ThreadFactory:

public class WorkerThreadFactory implements ThreadFactory {
   private int counter = 0;
   private String prefix = "";

   public WorkerThreadFactory(String prefix) {
     this.prefix = prefix;
   }

   public Thread newThread(Runnable r) {
     return new Thread(r, prefix + "-" + counter++);
   }
}

如果你有这样的要求,如果没有工厂或生成器模式,实现它将是非常困难的。


ThreadFactory是 Java API 的一部分,因为它也被其他类使用。因此,上面的例子说明了为什么在某些情况下我们应该使用“工厂来创建线程”,但是,当然,绝对没有必要实现来完成此任务。java.util.concurrent.ThreadFactory


推荐