线程池封装类
  fBdBA9tXzLZY 2023年12月22日 47 0

开发过程中我们经常有需用用到线程池的场景,防止服务器资源不足导致OOM,所以就需要用到线程池来做资源的及时的回收释放,来做到资源利用的最大化,下面就是我自己针对EXECUTOR框架的一个线程池封装,希望可以帮到同行小伙伴。public class ThreadPool {

private static ThreadPool pool;
private static final int CPU_COUNT = 2;
private static boolean init = false;
private final int corePoolSize;
private final int maxPoolSize;
private ThreadPoolExecutor newExecutor;
private static final int DEFAULT_NEW_POOL_SIZE = Runtime.getRuntime().availableProcessors() * CPU_COUNT;
private static final int DEFAULT_NEW_MAX_POOL_SIZE = 200;
private static final int DEFAULT_NEW_KEEP_ALIVE_TIME = 3000;
private static final int DEFAULT_NEW_QUEUE_SIZE = 1000;

public ThreadPool() {
	this.corePoolSize = DEFAULT_NEW_POOL_SIZE;
	this.maxPoolSize = DEFAULT_NEW_MAX_POOL_SIZE;
	newExecutor = new ThreadPoolExecutor(this.corePoolSize, this.maxPoolSize, DEFAULT_NEW_KEEP_ALIVE_TIME,
			TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(DEFAULT_NEW_QUEUE_SIZE),
			new ThreadPoolExecutor.DiscardOldestPolicy());
}

public ThreadPool(int corePoolSize) {
	this.corePoolSize = corePoolSize;
	this.maxPoolSize = DEFAULT_NEW_MAX_POOL_SIZE;
	newExecutor = new ThreadPoolExecutor(this.corePoolSize, this.maxPoolSize, DEFAULT_NEW_KEEP_ALIVE_TIME,
			TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(DEFAULT_NEW_QUEUE_SIZE),
			new ThreadPoolExecutor.DiscardOldestPolicy());
}

/**
 * 初始化一个线程池
 */
public synchronized static void init() {
	if (!init) {
		pool = new ThreadPool();
		init = true;
	}
}

/**
 * 初始化指定大小的线程池
 *
 * @param corePoolSize
 *            线程池大小
 */
public synchronized static void init(int corePoolSize) {
	if (!init) {
		pool = new ThreadPool(corePoolSize);
		init = true;
	}
}

public static int getExecutorActiveCount() {
	return pool.newExecutor.getActiveCount();
}

/**
 * 启动一次静态线程池的顺序关闭,执行历史任务,但不接受新任务
 */
public synchronized static void shutdownStaticPool() {
	if (!pool.newExecutor.isShutdown())
		pool.newExecutor.shutdown();
}

/**
 * 如果线程池关闭后所有任务都已完成,返回true
 *
 * @return 是否关闭
 */
public static boolean isStaticPoolShutDown() {
	return pool.newExecutor.isShutdown();
}

/**
 * 加入一个任务到池内
 *
 * @param r
 *            线程任务
 * @return future对象
 */
public static Future<?> submit(Runnable r) {
	if (!init) {
		init();
	}
	return pool.newExecutor.submit(r);
}

/**
 * 回调线程加入一个任务到池内
 *
 * @param r
 *            线程任务
 * @return Future
 */
public static Future<?> submit(Callable<?> r) {
	if (!init) {
		init();
	}
	return pool.newExecutor.submit(r);
}

/**
 * 加入一组任务到池
 *
 * @param al
 *            批量任务
 * @return List
 */
public static List<Future<?>> submit(List<Runnable> al) {
	List<Future<?>> fl = new CopyOnWriteArrayList<Future<?>>();
	if (!init) {
		init();
	}
	for (Runnable r : al) {
		fl.add(submit(r));
	}
	return fl;
}

/**
 * 获取线程池的实例
 *
 * @return ThreadPoolExecutor
 */
public ThreadPoolExecutor getThreadPoolExecutor() {
	return pool.newExecutor;
}

/**
 * 添加任务
 *
 * @param r
 *            线程任务
 */
public void enqueue(Runnable r) {
	newExecutor.execute(r);
}

/**
 * 批量添加任务
 *
 * @param al
 *            批量任务
 */
public void enqueue(List<Runnable> al) {
	for (Runnable r : al) {
		enqueue(r);
	}
}

/**
 * 获取线程池中任务个数
 *
 * @return int
 */
public int getQueueCount() {
	return newExecutor.getQueue().size();
}

/**
 * 获得当前活动的线程数
 *
 * @return int
 */
public int getActiveCount() {
	return ((ThreadPoolExecutor) newExecutor).getActiveCount();
}

/**
 * 获得线程池中空闲线程的个数,近似值
 *
 * @return int
 */
public int getIdleThreadCount() {
	int getIdleThreadCount = this.corePoolSize - newExecutor.getActiveCount();
	return getIdleThreadCount > 0 ? getIdleThreadCount : 0;
}

/**
 * 获得线程池实例
 *
 * @return ThreadPool
 */
public static ThreadPool getPool() {
	return pool;
}

}

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月22日 0

暂无评论

推荐阅读
  fBdBA9tXzLZY   2023年12月22日   48   0   0 线程池线程池
fBdBA9tXzLZY