在Java executors框架中理解ThreadPoolExecutor和ThreadFactory
说: 使用在Java executors框架中理解ThreadPoolExecutor和ThreadFactory,java,multithreading,Java,Multithreading,说: 使用ThreadFactory创建新线程。如果未另行指定,将使用Executors.defaultThreadFactory(),该函数将创建所有线程,使其处于相同的ThreadGroup中,并且具有相同的NORM\u优先级优先级和非守护进程状态。通过提供不同的线程工厂,您可以更改线程的名称、线程组、优先级、守护进程状态等 中的一个示例包含以下行: ThreadFactory threadFactory = Executors.defaultThreadFactory(); ThreadP
ThreadFactory
创建新线程。如果未另行指定,将使用Executors.defaultThreadFactory()
,该函数将创建所有线程,使其处于相同的ThreadGroup
中,并且具有相同的NORM\u优先级
优先级和非守护进程状态。通过提供不同的线程工厂
,您可以更改线程的名称、线程组、优先级、守护进程状态等
中的一个示例包含以下行:
ThreadFactory threadFactory = Executors.defaultThreadFactory();
ThreadPoolExecutor executorPool = new ThreadPoolExecutor(2, 4, 10, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(2), threadFactory, rejectionHandler);
ThreadFactory ThreadFactory=Executors.defaultThreadFactory();
ThreadPoolExecutor executorPool=新的ThreadPoolExecutor(2,4,10,TimeUnit.SECONDS,新的ArrayBlockingQueue(2),threadFactory,rejectionHandler);
我试图在上述代码的上下文中理解引用自官方文件的最后一句话。换句话说,我如何传递不同的
ThreadFactory
来更改线程的名称、线程组、优先级和守护进程状态?如何实现这一点?ThreadFactory
接口包含newThread(Runnable r)
方法。您可以实现它,这样创建的线程将有更多有意义的名称
例如:
private final static String THREAD_NAME_TEMPLATE = "%s-pool-%d-thread-%d";
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(group, r,
String.format(THREAD_NAME_TEMPLATE, namePrefix, poolNumber, threadNumber.getAndIncrement()),
0);
t.setDaemon(false);
t.setPriority(Thread.NORM_PRIORITY);
return t;
}
ThreadFactory
是一个带有单个函数的接口,threadnewthread(Runnable r)
。ThreadFactory的Javadoc中的示例实现:
class SimpleThreadFactory implements ThreadFactory {
public Thread newThread(Runnable r) {
return new Thread(r);
}
}
Thread
有8个不同的构造函数,允许您设置线程名称、堆栈大小和线程组。它还可以调用多个setter,以控制线程优先级、类装入器等。您甚至可以返回线程的某个子类,其中包含您选择的任何行为
因此,您可以创建自己的实例,并将其传递到新的
ThreadPoolExecutor
中,而不是传递Executors.defaultThreadFactory()的返回值。您发布的代码使用一个构造函数为执行器指定threadfactory。问题是什么?ThreadFactory
是一个接口,您可以自己为其创建一个实现。因此,实现ThreadFactory
是实现这一点的唯一方法,框架没有显式提供任何帮助器/实用程序类?不知何故,我觉得只提供接口并要求我们实现它来实现可能是常见的用例场景有点不完整,期望框架提供这样的实用工具工厂。它为您提供了一个默认的。不管怎样,这些属性中的大多数(线程组、优先级、守护进程状态)都是更好的选择。名字可能是最有用的。