自定义拒绝策略、自定义ThreadFactory、自定义线程池

package com.wucj.controller.thread;import com.alibaba.fastjson.JSON;
import com.wucj.entity.MessageEntity;
import com.wucj.utils.UUIDUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;/*** \* Created with IntelliJ IDEA.* \* @author: wucj* \* @date: 2020/1/27 14:49* \* @description:* \*/
@Slf4j
public class ExcutorServiceSingle{/** 单例 **/private static ExcutorServiceSingle instance = null;/** 线程池管理类:使用自定义的拒绝策略**/private static ExecutorService executorService =new ThreadPoolExecutor(2, 5, 5,TimeUnit.SECONDS, new ArrayBlockingQueue<>(10),new MessageThreadFactory(),new MessageRejectedExecutionHandler());private ExcutorServiceSingle() {}/** 获取单例 **/public static ExcutorServiceSingle getInstance(){if(null==instance){synchronized(ExcutorServiceSingle.class){instance = new ExcutorServiceSingle();}}return instance;}/** 发起异步执行 **/public void excutor(MessageEntity messageEntity){MessageRunable messageRunable = new MessageRunable(messageEntity);executorService.submit(messageRunable);}/*** Attempts to stop all actively executing tasks, halts the* processing of waiting tasks, and returns a list of the tasks* that were awaiting execution.** <p>This method does not wait for actively executing tasks to* terminate.** <p>There are no guarantees beyond best-effort attempts to stop* processing actively executing tasks.  For example, typical* implementations will cancel via {@link Thread#interrupt}, so any* task that fails to respond to interrupts may never terminate.** @return list of tasks that never commenced execution* @throws SecurityException if a security manager exists and*         shutting down this ExecutorService may manipulate*         threads that the caller is not permitted to modify*         because it does not hold {@link*         java.lang.RuntimePermission}{@code ("modifyThread")},*         or the security manager's {@code checkAccess} method*         denies access.*/public void shutDownNow(){List<Runnable> messageRunableList = executorService.shutdownNow();if(CollectionUtils.isEmpty(messageRunableList)){log.info("线程池关闭时,不存在正在执行的线程...");}else{String uuid = UUIDUtils.create();log.info("{}线程池关闭时,存在正在执行的线程...",uuid);for (Runnable runnable : messageRunableList) {log.info("{}线程池关闭时,存在线程:{}",uuid, JSON.toJSONString(runnable));}}}/*** Initiates an orderly shutdown in which previously submitted* tasks are executed, but no new tasks will be accepted.* Invocation has no additional effect if already shut down.* <p>This method does not wait for previously submitted tasks to* complete execution.** @throws SecurityException {@inheritDoc}*/public void shutDown(){executorService.shutdown();}/*** Returns {@code true} if this executor has been shut down.** @return {@code true} if this executor has been shut down*/public boolean isShutDown(){return executorService.isShutdown();}
}
package com.wucj.controller.thread;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;/*** \* Created with IntelliJ IDEA.* \* @author: wucj* \* @date: 2020/1/27 16:33* \* @description: 自定义线程池丢弃策略* \*/
@Slf4j
public class MessageRejectedExecutionHandler implements RejectedExecutionHandler {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {log.info("消息推送超过异步任务的最大长度,执行拒绝策略,{}",executor.toString());}
}
package com.wucj.controller.thread;import com.alibaba.fastjson.JSON;
import com.wucj.entity.MessageEntity;
import com.wucj.utils.UUIDUtils;
import lombok.extern.slf4j.Slf4j;import java.util.concurrent.TimeUnit;/*** \* Created with IntelliJ IDEA.* \* @author: wucj* \* @date: 2020/1/27 14:55* \* @description:* \*/
@Slf4j
public class MessageRunable implements Runnable{private MessageEntity messageEntity;public MessageRunable(MessageEntity messageEntity) {this.messageEntity = messageEntity;}@Overridepublic void run() {String uuid = UUIDUtils.create();log.info("{}发送消息:{}",uuid, JSON.toJSONString(messageEntity));try {TimeUnit.SECONDS.sleep(60);} catch (InterruptedException e) {log.error("{}消息发送异常:{}",uuid,e);}log.info("{}消息发送完成",uuid);}
}
package com.wucj.controller.thread;import java.util.concurrent.ThreadFactory;/*** \* Created with IntelliJ IDEA.* \* @author: wucj* \* @date: 2020/1/27 15:26* \* @description: 线程组线程管理类* \*/
public class MessageThreadFactory implements ThreadFactory {/** 线程所属组名称 **/private String groupName = "消息发送线程组";/** 线程名称 **/private String threadName = "消息发送线程名称";/** 栈大小 **/private int stackSize = 0;/** 线程组 **/private ThreadGroup threadGroup = new ThreadGroup(groupName);@Overridepublic Thread newThread(Runnable r) {Thread t = new Thread(threadGroup,r,threadName,stackSize);if (t.isDaemon()){t.setDaemon(false);}if (t.getPriority() != Thread.NORM_PRIORITY){t.setPriority(Thread.NORM_PRIORITY);}return t;}
}

测试

@Data
public class MessageEntity {private String message;private String toUserName;
}
package com.wucj.controller;import com.wucj.base.BaseResult;
import com.wucj.controller.thread.ExcutorServiceSingle;
import com.wucj.entity.MessageEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;/*** \* Created with IntelliJ IDEA.* \* @author: wucj* \* @date: 2020/1/21 20:12* \* @description:* \*/
@RestController
@Slf4j
@RequestMapping("api/thread")
public class ThreadController {@GetMapping("info")public BaseResult nowThreadInfo(){ThreadGroup group = Thread.currentThread().getThreadGroup();log.info("当前线程组的名称:",group.getName());Thread[] list1 = new Thread[group.activeCount()];group.enumerate(list1);for (Thread thread:list1){log.info("分组:{},名称:{}",group.getName(),thread.getName());}ThreadGroup groupParent = group.getParent();log.info("当前线程组的名称:",groupParent.getName());Thread[] list2 = new Thread[groupParent.activeCount()];groupParent.enumerate(list2);for (Thread thread:list2){log.info("分组:{},名称:{}",groupParent.getName(),thread.getName());}ThreadGroup groupParentT = groupParent.getParent();return BaseResult.success("操作成功");}@PostMapping("excutor")public BaseResult threadExcutoer(@RequestBody MessageEntity messageEntity){ExcutorServiceSingle excutorServiceSingle = ExcutorServiceSingle.getInstance();excutorServiceSingle.excutor(messageEntity);return BaseResult.success("操作成功");}@GetMapping("shutDownNow")public BaseResult shutDownNow(){ExcutorServiceSingle excutorServiceSingle = ExcutorServiceSingle.getInstance();try{excutorServiceSingle.shutDownNow();return BaseResult.success("停止成功");}catch (Exception e){log.error("停止线程池异常:{}",e);return BaseResult.success("停止异常");}}@GetMapping("shutDown")public BaseResult shutDown(){ExcutorServiceSingle excutorServiceSingle = ExcutorServiceSingle.getInstance();try{excutorServiceSingle.shutDown();return BaseResult.success("尝试停止成功");}catch (Exception e){log.error("尝试关闭线程池异常:{}",e);return BaseResult.success("尝试停止异常");}}@GetMapping("isShutDown")public BaseResult isShutDown(){ExcutorServiceSingle excutorServiceSingle = ExcutorServiceSingle.getInstance();try{boolean bool = excutorServiceSingle.isShutDown();if(bool){return BaseResult.success("线程池已经停止");}else{return BaseResult.success("线程池未停止");}}catch (Exception e){log.error("检查是否已经停止异常:{}",e);return BaseResult.success("检查是否已经停止异常");}}
}

自定义线程池使用实例相关推荐

  1. 自定义线程池内置线程池的使用 ThreadPoolExecutor和Executorservice 示例与注意事项

    文章目录 线程池介绍 自己设计一个线程池 1.设计ThreadPool类: 2.设计工作队列 3.实现自己设计的线程池 用java的ThreadPoolExecutor自定义线程池 自定义线程池-参数 ...

  2. Android 自定义线程池的实战

    前言:在上一篇文章中我们讲到了AsyncTask的基本使用.AsyncTask的封装.AsyncTask 的串行/并行线程队列.自定义线程池.线程池的快速创建方式. 对线程池不了解的同学可以先看 An ...

  3. Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池

    前言:由于最近在做SDK的功能,需要设计线程池.看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到 ...

  4. java自定义线程_Java自定义线程池详解

    自定义线程池的核心:ThreadPoolExecutor 为了更好的控制多线程,JDK提供了一套线程框架Executor,帮助开发人员有效的进行线程控制,其中在java.util.concurrent ...

  5. 【Java线程】“打工人”初识线程池及自定义线程池实战

    目录 理论 原理 线程池创建 工作流程图 拒绝策略 参数设置 四种线程池 实战 理论 聊一下为什么要使用线程池? 程序的运行本质,就是通过使用系统资源(CPU.内存.网络.磁盘等等)来完成信息的处理, ...

  6. 使用静态内部类单例模式创建自定义线程池

    一.使用场景 1.有时候业务上A端和B端做接口传输消息,B端收到消息后做进一步数据处理(持久化或者解析)等耗时的操作,如果是同步操作会造成等待.超时等情况.可以先向A端返回一个收到信息的消息,再多线程 ...

  7. android自定义线程池工具类,妈妈再也不用担心你不会使用线程池了(ThreadUtils)...

    为什么要用线程池 使用线程池管理线程有如下优点:降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行. 提高线程的可 ...

  8. Java 自定义线程池

    Java 自定义线程池 https://www.cnblogs.com/yaoxiaowen/p/6576898.html public ThreadPoolExecutor(int corePool ...

  9. Spring Boot使用@Async实现异步调用:自定义线程池

    在之前的Spring Boot基础教程系列中,已经通过<Spring Boot中使用@Async实现异步调用>一文介绍过如何使用 @Async注解来实现异步调用了.但是,对于这些异步执行的 ...

最新文章

  1. 不敢相信,原来大厂是这样找到精准人才的!
  2. mysql占用cpu_Mysql占用过高CPU时的优化手段(必看)
  3. ajax请求文件下载 php,使用Ajax请求下载文件
  4. professor xi‘s story
  5. python post请求_python发送http的post请求
  6. widedeep 在贝壳推荐场景的实践
  7. 一个12年ABAP开发专家和ABAP那些事儿
  8. CCDP-思科认证网络设计高级工程师
  9. 64位内核第二讲,进程保护之对象钩子
  10. 腾讯花85亿买岛;微信发原图或泄露位置信息?高通逼因特尔把Modem芯片业务卖给苹果?小米9官网正式下架……...
  11. 【BZOJ1922】【Tyvj1736】【codevs2129】大陆争霸,无语最短路
  12. 基于JAVA+SpringMVC+Mybatis+MYSQL的在线问卷答题系统
  13. Leetcode-403-青蛙过河(DFS+备忘录)
  14. 什么是垃圾回收(转)
  15. 【修真院“善良”系列之十】初级Java程序员的学习路线 1
  16. 知识普及 上海宝付带你揭穿金融诈骗“小把戏”
  17. matlab白光干涉,matlab白光干涉
  18. 科学计算机sd mode使用方法,你是否知道科学计算器的使用方法
  19. Python3 浮点数精度问题
  20. c语言:求两个数的最大公约数与最小公倍数

热门文章

  1. python 常用框架简介
  2. xshell_7下载安装以及评估期已过的解决办法
  3. C#电话号码联系方式校验 代码实现
  4. layUI瀑布流使用方法
  5. 《原神》部分渲染效果分析(非官方)
  6. 开发实战:如何利用实时语音转写技术搞定会议纪要
  7. dhcp服务器的dns怎么修改,H3C S5500-28C-EI-D 如何修改已经设置的 DHCP 地址段 和DNS ....
  8. 怎么样做好网站关键词的选择与部署?
  9. 数据统计软件SPSS PASW Statistics v18 多国语言版功能介绍
  10. 7-2 sdut-打印PYTHON关键字