首页 > 编程语言 >java线程池管理工具类

java线程池管理工具类

时间:2023-11-30 14:32:25浏览次数:48  
标签:ExecutorService java 管理工具 static 线程 new executorService public

1,这是线程池管理工具类,在系统关闭时确保任务执行完毕,自定义线程名字,自定义抛弃策略默认使用了CallerRunsPolicy拒绝策略


import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;

import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy;
import java.util.concurrent.TimeUnit;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author yannan 
 * 20231128
 */

public class ThreadUtil {

	private static final Logger logger = LoggerFactory.getLogger(ThreadUtil.class);


	public static class CustomThreadFactory implements ThreadFactory {
		private final String namePrefix;

		public CustomThreadFactory(String namePrefix) {
			this.namePrefix = namePrefix;
		}

		public Thread newThread(Runnable runnable) {
			Thread thread = new Thread(runnable);
			thread.setName(namePrefix + thread.getId());
			return thread;
		}
	}

	/**
	 * 轮询等待ExecutorService线程池中所有线程执行完毕
	 * 
	 * @param executorService
	 */
	public static void isTerminated(ExecutorService executorService) {
		StringBuffer sb = new StringBuffer();
		executorService.submit(() -> {
			sb.append(Thread.currentThread().getName());
			// System.out.println("Task executed by thread: " + threadName);
		});
		executorService.shutdown();
		// 轮询等待ExecutorService线程池中所有线程执行完毕
		while (true) {
			if (executorService.isTerminated()) {
				// System.err.println(executorService.getClass().getName()+" end");
				logger.info("线程池 " + sb.toString() + " END 关闭成功");
				break;
			}
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	/**
	 * 等待超时
	 * 
	 * @param executorService
	 */
	public static void awaitTermination(ExecutorService executorService) {
		try {
			executorService.awaitTermination(5 * 60, TimeUnit.SECONDS);
		} catch (InterruptedException e) {
			e.printStackTrace();
			logger.info("等待超时,直接关闭");
		}
	}

	/**
	 * 	 */
	public static ExecutorService newSingleThreadExecutor(String threadName) {
		// "Log-Thread-"
		ThreadFactory threadFactory = new ThreadUtil.CustomThreadFactory(threadName);
		ExecutorService executorService = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,
				new LinkedBlockingQueue<Runnable>(), threadFactory, callerRunsPolicy());
		return executorService;

	}

	public static ExecutorService newFixedThreadPool(int nThreads, String threadName) {
		ThreadFactory threadFactory = new ThreadUtil.CustomThreadFactory(threadName);
		ExecutorService executorService = new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS,
				new LinkedBlockingQueue<Runnable>(), threadFactory, callerRunsPolicy());
		return executorService;

	}
	/**
	 * CallerRunsPolicy拒绝策略,相对而言它就比较完善了,当有新任务提交后,如果线程池没被关闭且没有能力执行,则把这个任务交于提交任务的线程执行,也就是谁提交任务,谁就负责执行任务。这样做主要有两点好处。
	 * @return
	 */
	public static CallerRunsPolicy callerRunsPolicy() {
		return  new ThreadPoolExecutor.CallerRunsPolicy();
	}

	public static int getCorePoolSize(ExecutorService executorService) {
		int threadSize = 0;
		if (executorService instanceof ThreadPoolExecutor) {
			threadSize = ((ThreadPoolExecutor) executorService).getCorePoolSize();
			logger.info("核心线程数量为:" + threadSize);
		}
		return threadSize;
	}
}

标签:ExecutorService,java,管理工具,static,线程,new,executorService,public
From: https://blog.51cto.com/u_13626606/8629856

相关文章

  • JavaScript 防抖和节流
    JavaScript防抖和节流防抖以下js类库实现方法:lodash.debounceunderscore-debounce最初接触实现一个防抖函数的需求,是在前端封装React组件的过程中,当时是要实现一个搜索下拉框,根据输入提示搜索内容。根据<input>的input事件来监听用户输入,并调用后端接口传递输入信息......
  • Qt主线程和子线程协作更新UI
    一、概述现有一个需求:Qt+OpenCV执行角点检测。使用Qt当做UI界面进行角点检测。我们知道像角点检测这种算法需要大量的计算,是比较耗时的一个操作。如果把计算+UI显示全放入主线程中计算,那么UI界面有可能就会卡主,进而出现应用程序无响应的情况。要求:使......
  • javascript运行时报"未定义"错误怎么办
    https://www.php.cn/faq/508703.htmlJavascript是一种非常流行的编程语言,它广泛地应用于网页开发、动态效果实现、数据处理等领域。然而,Javascript也存在一些常见的错误,在开发的过程中需要我们注意和处理。其中之一的运行时错误:""未定义,下面就来详细介绍如何解决这一问题。什么......
  • 扩展的Java程序
    编写可扩展的Java程序是面向未来需求的关键。可扩展性使得程序能够方便地应对变化和增长,而不需要重构或重写大量代码。下面将介绍一些编写可扩展Java程序的最佳实践和设计原则,以帮助开发者构建灵活、可维护和具有良好扩展性的应用。模块化设计模块化设计是构建可扩展Java程序的基......
  • Java 开发的概念和分层 DTO、TO、VO、PO、DO、BO、AO、DAO、POJO
    POJOPOJO(PlainOrdinaryJavaObject)POJO专指只有setter/getter/toString的简单类,包括DO/DTO/BO/VOBean就是符合规约的POJOAO(ApplicationObject)AO(ApplicationObjectService层上服用多个服务例如一个Controller需要使用多Service组装一个AODTODTO(Da......
  • Java学习之路(八)
    Java学习之路(八)1、案例驱动模式1.1、案例驱动模式概述(理解)通过我们已掌握的知识点,先实现一个案例,然后找出这个案例中,存在的一些问题,在通过新知识点解决问题1.2、案例驱动模式的好处(理解)解决重复代码过多的冗余,提高代码的复用性解决业务逻辑聚集紧密导致的可读性......
  • Java集合迭代器的使用
    Java迭代器(Iterator)是Java集合框架中的一种机制,它提供了一种在不暴露集合内部实现的情况下遍历集合元素的方法。JavaIterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代ArrayList和HashSet等集合获取迭代器对象Iterator<类型>it=list.iterator();迭代器方......
  • java代码连接redis
    RedisURIuri=RedisURI.Builder.redis("XXXX",16379).withDatabase(6).withPassword("XXXX").build();redisClient=RedisClient.create(uri);conn......
  • java集合框架(三)ArrayList常见方法的使用
    @[toc]##一、什么是ArrarListArrayList是Java中的一个动态数组类,可以根据实际需要自动调整数组的大小。ArrayList是基于数组实现的,它内部维护的是一个Object数组,默认初始化容量为10,当添加的元素个数超过了当前容量时,会自动扩容。ArrayList也被广泛用于Java中的集合框架,例如Java......
  • 【SpringBoot】单元测试报错java.lang.IllegalStateException: Could not load TestCo
    一、运行test类方法时候报错 二、分析原因,发现版本不一致 三、找到pom文件, 把<version>RELEASE</version>注释掉,刷新一下maven依赖 四:修改后,依赖版本一致。 这样,就可以运行了。 ......