All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.buli_home.utils.thread.ThreadFactoryBuilder Maven / Gradle / Ivy

There is a newer version: 0.3.1
Show newest version
package cn.buli_home.utils.thread;


import cn.buli_home.utils.common.StringUtils;
import javafx.util.Builder;

import java.io.Serializable;
import java.lang.Thread.UncaughtExceptionHandler;
import java.util.Objects;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicLong;

/**
 * ThreadFactory创建器
* 参考:Guava的ThreadFactoryBuilder * * @author mustard */ public class ThreadFactoryBuilder implements Builder, Serializable { private static final long serialVersionUID = 1L; /** * 用于线程创建的线程工厂类 */ private ThreadFactory backingThreadFactory; /** * 线程名的前缀 */ private String namePrefix; /** * 是否守护线程,默认false */ private Boolean daemon; /** * 线程优先级 */ private Integer priority; /** * 未捕获异常处理器 */ private UncaughtExceptionHandler uncaughtExceptionHandler; /** * 创建{@code ThreadFactoryBuilder} * * @return {@code ThreadFactoryBuilder} */ public static ThreadFactoryBuilder create() { return new ThreadFactoryBuilder(); } /** * 设置用于创建基础线程的线程工厂 * * @param backingThreadFactory 用于创建基础线程的线程工厂 * @return this */ public ThreadFactoryBuilder setThreadFactory(ThreadFactory backingThreadFactory) { this.backingThreadFactory = backingThreadFactory; return this; } /** * 设置线程名前缀,例如设置前缀为mustard-thread-,则线程名为mustard-thread-1之类。 * * @param namePrefix 线程名前缀 * @return this */ public ThreadFactoryBuilder setNamePrefix(String namePrefix) { this.namePrefix = namePrefix; return this; } /** * 设置是否守护线程 * * @param daemon 是否守护线程 * @return this */ public ThreadFactoryBuilder setDaemon(boolean daemon) { this.daemon = daemon; return this; } /** * 设置线程优先级 * * @param priority 优先级 * @return this * @see Thread#MIN_PRIORITY * @see Thread#NORM_PRIORITY * @see Thread#MAX_PRIORITY */ public ThreadFactoryBuilder setPriority(int priority) { if (priority < Thread.MIN_PRIORITY) { throw new IllegalArgumentException(StringUtils.format("Thread priority ({}) must be >= {}", priority, Thread.MIN_PRIORITY)); } if (priority > Thread.MAX_PRIORITY) { throw new IllegalArgumentException(StringUtils.format("Thread priority ({}) must be <= {}", priority, Thread.MAX_PRIORITY)); } this.priority = priority; return this; } /** * 设置未捕获异常的处理方式 * * @param uncaughtExceptionHandler {@link UncaughtExceptionHandler} * @return this */ public ThreadFactoryBuilder setUncaughtExceptionHandler(UncaughtExceptionHandler uncaughtExceptionHandler) { this.uncaughtExceptionHandler = uncaughtExceptionHandler; return this; } /** * 构建{@link ThreadFactory} * * @return {@link ThreadFactory} */ @Override public ThreadFactory build() { return build(this); } /** * 构建 * * @param builder {@code ThreadFactoryBuilder} * @return {@link ThreadFactory} */ private static ThreadFactory build(ThreadFactoryBuilder builder) { final ThreadFactory backingThreadFactory = (Objects.nonNull(builder.backingThreadFactory)) ? builder.backingThreadFactory : Executors.defaultThreadFactory(); final String namePrefix = builder.namePrefix; final Boolean daemon = builder.daemon; final Integer priority = builder.priority; final UncaughtExceptionHandler handler = builder.uncaughtExceptionHandler; final AtomicLong count = (null == namePrefix) ? null : new AtomicLong(); return r -> { final Thread thread = backingThreadFactory.newThread(r); if (Objects.nonNull(namePrefix)) { thread.setName(namePrefix + count.getAndIncrement()); } if (Objects.nonNull(daemon)) { thread.setDaemon(daemon); } if (Objects.nonNull(priority)) { thread.setPriority(priority); } if (Objects.nonNull(handler)) { thread.setUncaughtExceptionHandler(handler); } return thread; }; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy