news 2026/7/4 10:59:31

线程队列搭配实际用法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
线程队列搭配实际用法

守护线程 Thread
一直在死循环 等待从 DelayQueue<DelayedTask<?>> 队列里面拿出任务
提交给线程池 ExecutorService 执行线程池的任务

继承 Runnable的任务
把任务放入延时队列 DelayQueue<DelayedTask<?>>

守护线程 = 死循环的搬运工,一直从队列里 take() 任务
线程池 = 真正干活的工人,执行 Runnable.run()
业务代码 = 只负责创建任务丢进队列,丢完就走

private void updateStudentWordInfoBatch(List<StudentWordMongo>studentWordMongoList, Long studentId){DelayQueueManager manager=DelayQueueManager.getInstance();UpdateStudentWordBatchTask updateStudentWordBatchTask=new UpdateStudentWordBatchTask(studentId, studentWordMongoList, this);manager.put(updateStudentWordBatchTask,0, TimeUnit.MILLISECONDS, ContentDelayed.UPDATE_STUDENT_WORD_BATCH);}
package com.wj.airead.api.sys.delayed;importjava.util.concurrent.*;/** * @ClassName DelayQueueManager * @Description TOPO 队列处理 * @Author yg * @Date2021/12/209:57 * @Version1.0**/ public class DelayQueueManager{private final static int DEFAULT_THREAD_NUM=16;private static final int thread_num=4;/** * 单例模式,返回队列管理实例 */ private static final DelayQueueManager instance=new DelayQueueManager();// 固定大小线程池 private final ExecutorService executor;// 延时队列 private final DelayQueue<DelayedTask<?>>delayQueue;// 守护线程 private Thread daemonThread;privateDelayQueueManager(){executor=new ThreadPoolExecutor(thread_num, DEFAULT_THREAD_NUM, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());delayQueue=new DelayQueue<>();init();}public static DelayQueueManagergetInstance(){returninstance;}/** * 队列管理类初始化 */ public voidinit(){/*daemonThread=new Thread(()->{execute();});*/ // 上下2种写法是等价的,上面的Lambda写法只在java8及以后的版本中有效 daemonThread=new Thread(newRunnable(){@Override public voidrun(){execute();}});daemonThread.setName("DelayQueueMonitor");daemonThread.start();}private voidexecute(){while(true){try{// 从延时队列中获取任务 DelayedTask<?>delayedTask=delayQueue.take();if(delayedTask!=null){Runnable task=delayedTask.getTask();if(null==task){continue;}// 提交到线程池执行task executor.execute(task);}}catch(Exception e){e.printStackTrace();}}}/** * 添加任务 * * @param task 任务实例化对象 * @paramtime任务延后时间 * @param unit 时间单位 * @param rf 任务类型 * @author yg * @date2020年2月20日 下午8:43:28 */ public void put(Runnable task, long time, TimeUnit unit, String rf){// 获取延时时间 longtimeout=TimeUnit.NANOSECONDS.convert(time, unit);DelayedTask<?>delayedTask=new DelayedTask<>(timeout, task);delayQueue.put(delayedTask);}/** * 删除任务 * * @param task * @return */ public boolean removeTask(DelayedTask<?>task){returndelayQueue.remove(task);}}
package com.wj.airead.api.sys.delayed;importjava.util.concurrent.*;/** * @ClassName DelayQueueManager * @Description TOPO 队列处理 * @Author yg * @Date2021/12/209:57 * @Version1.0**/ public class DelayQueueManager{private final static int DEFAULT_THREAD_NUM=16;private static final int thread_num=4;/** * 单例模式,返回队列管理实例 */ private static final DelayQueueManager instance=new DelayQueueManager();// 固定大小线程池 private final ExecutorService executor;// 延时队列 private final DelayQueue<DelayedTask<?>>delayQueue;// 守护线程 private Thread daemonThread;privateDelayQueueManager(){executor=new ThreadPoolExecutor(thread_num, DEFAULT_THREAD_NUM, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());delayQueue=new DelayQueue<>();init();}public static DelayQueueManagergetInstance(){returninstance;}/** * 队列管理类初始化 */ public voidinit(){/*daemonThread=new Thread(()->{execute();});*/ // 上下2种写法是等价的,上面的Lambda写法只在java8及以后的版本中有效 daemonThread=new Thread(newRunnable(){@Override public voidrun(){execute();}});daemonThread.setName("DelayQueueMonitor");daemonThread.start();}private voidexecute(){while(true){try{// 从延时队列中获取任务 DelayedTask<?>delayedTask=delayQueue.take();if(delayedTask!=null){Runnable task=delayedTask.getTask();if(null==task){continue;}// 提交到线程池执行task executor.execute(task);}}catch(Exception e){e.printStackTrace();}}}/** * 添加任务 * * @param task 任务实例化对象 * @paramtime任务延后时间 * @param unit 时间单位 * @param rf 任务类型 * @author yg * @date2020年2月20日 下午8:43:28 */ public void put(Runnable task, long time, TimeUnit unit, String rf){// 获取延时时间 longtimeout=TimeUnit.NANOSECONDS.convert(time, unit);DelayedTask<?>delayedTask=new DelayedTask<>(timeout, task);delayQueue.put(delayedTask);}/** * 删除任务 * * @param task * @return */ public boolean removeTask(DelayedTask<?>task){returndelayQueue.remove(task);}}
package com.wj.airead.api.word.task;importcom.wj.airead.api.student.entity.StudentWordMongo;importcom.wj.airead.api.word.service.IStudentWordMongoService;importjava.util.List;/** * @ClassName SaveStudentWordBatchTask * @Description TOPO 批量添加用户词汇掌握情况 * @Author yg * @Date2021/12/209:57 * @Version1.0**/ public class UpdateStudentWordBatchTask implements Runnable{public List<StudentWordMongo>studentWordInfoList;public IStudentWordMongoService studentWordMongoService;public Long studentId;/** * 构造方法 初始化参数 * * @param studentWordInfoList * @param studentWordMongoService */ public UpdateStudentWordBatchTask(Long studentId, List<StudentWordMongo>studentWordInfoList, IStudentWordMongoService studentWordMongoService){this.studentWordInfoList=studentWordInfoList;this.studentWordMongoService=studentWordMongoService;this.studentId=studentId;}/** * 执行内容 */ @Override public voidrun(){studentWordMongoService.updateMongo(studentWordInfoList, studentId);}}
package com.wj.airead.api.sys.delayed;importjava.util.concurrent.Delayed;importjava.util.concurrent.TimeUnit;/** * @ClassName DelayedTask * @Description TOPO 延迟处理 * @Author yg * @Date2021/12/209:57 * @Version1.0**/ public class DelayedTask<T extends Runnable>implements Delayed{private final longtime;// 任务延迟时间 private final T task;// 任务类 public DelayedTask(long timeout, T task){this.time=System.nanoTime()+timeout;this.task=task;}@Override public int compareTo(Delayed o){DelayedTask<?>other=(DelayedTask<?>)o;longdiff=time- other.time;if(diff>0){return1;}elseif(diff<0){return-1;}else{return0;}}@Override public long getDelay(TimeUnit unit){returnunit.convert(this.time - System.nanoTime(), TimeUnit.NANOSECONDS);}@Override public inthashCode(){returntask.hashCode();}/** * 获取任务对象 * * @return * @author yg * @date2020年2月20日 上午11:55:29 */ public TgetTask(){returntask;}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/29 0:35:14

小程序自助搭建平台有哪些?免代码工具功能和适用场景分析

小程序自助搭建平台有哪些&#xff1f;免代码工具功能和适用场景分析小程序自助搭建平台的核心价值&#xff0c;是让没有技术团队的商家也能把线上入口搭起来。但“自助”不等于随便套模板。真正能用的小程序&#xff0c;至少要考虑页面结构、表单、预约、活动、会员入口、多端…

作者头像 李华
网站建设 2026/6/29 1:01:48

基于 Node.js, Satori, Sharp 的海报合成服务实现

从零开始&#xff1a;使用 Node.js 构建自动化海报生成服务 1. 项目背景 在开发小程序时&#xff0c;我们需要分享动态生成不同内容的海报&#xff0c;实时生成带有文字标注的海报。为了追求高质量、可维护性和高效率&#xff0c;我们放弃了传统的 Canvas 方案&#xff0c;选…

作者头像 李华
网站建设 2026/6/29 0:32:16

LeetCode 热题 100 —— 6.三数之和(Javascript解法)

一、题目要求给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。注意&#xff1a;答案中不可以包含重复的三元组。…

作者头像 李华
网站建设 2026/6/29 10:44:49

Android FOSS:一份持续更新的安卓开源应用清单

文章目录Android FOSS&#xff1a;一份持续更新的安卓开源应用清单Android FOSS&#xff1a;一份持续更新的安卓开源应用清单 offa/android-foss 这个项目在 GitHub 上积累了 10,414 个 Star。它做的事情很简单&#xff1a;整理一份安卓平台上的免费开源软件清单。 清单覆盖的…

作者头像 李华
网站建设 2026/6/29 1:45:53

沉浸式娱乐成主流,VR真人CS引领文旅升级新趋势

随着消费升级&#xff0c;大众的线下娱乐需求早已发生翻天覆地的变化。过去单一的观光、休闲式游玩模式&#xff0c;已经无法满足当代年轻人的消费需求。如今的消费者&#xff0c;不再满足于“走马观花”式的游玩&#xff0c;更追求沉浸式、互动性、有体验感、有社交属性的娱乐…

作者头像 李华