线程池+队列

笔记:自己实现的线程池+队列。

package org.vic.thread.core;

import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public abstract class ThreadPool<T> implements Runnable {

private Integer defaultPoolSize = 10;
private Integer defaultQueueSize = 10;

private final ReentrantLock lock = new ReentrantLock();
private final Condition notEmpty = lock.newCondition();
private final Condition notFull = lock.newCondition();

private Long take_waittingMillis = 0L;
private Long put_warttingMillis = 0L;

private LinkedList<T> queue = new LinkedList<T>();

private boolean start = false;

public void take_waittingMills(Long val) {
this.take_waittingMillis = val;
}
public void put_waittingMills(Long val) {
this.put_warttingMillis = val;
}

/**
* @author Vic.Chu
* @param poolSize
* @param queueSize
* @param takeWaittingMillis
* @param putWaittingMillis
* Constructor
*/
public ThreadPool (Integer poolSize, Integer queueSize, Long takeWaittingMillis, Long putWaittingMillis) {
if (poolSize != null && poolSize > 0) {
defaultPoolSize = poolSize;
}
if (queueSize != null && queueSize > 0) {
defaultQueueSize = queueSize;
}
if (takeWaittingMillis != null && takeWaittingMillis > 0) {
take_waittingMills(takeWaittingMillis);
}
if (putWaittingMillis != null && putWaittingMillis > 0) {
put_waittingMills(putWaittingMillis);
}
}

/**
* @author Vic.Chu
* Constructor
*/
public ThreadPool () {}

/**
* threads will invoke this method after starting.
*/
@Override
public void run() {
try {
while (true) {
T t = take();
if (t == null) continue;
doProcess(t);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}

/**
* @author Vic.Chu
* @param t
* Programmers have to implement this method for processing their data.
* @return
*/
public abstract T doProcess(T t);

/**
* @author Vic.Chu
* When new this ThreadPool, you should start it!
*/
public void start() {
if (!start) {
for (int i = 0; i < defaultPoolSize; i++) {
Thread thread = new Thread(this);
thread.start();
}
this.start = true;
}
}

/**
* @author Vic.Chu
* @param collection. the data collection which should be processed.
* @throws Exception. If the collection is null or is empty, this exception will be thrown.
*/
public void putCollections (Collection<? extends T> collection) throws Exception {
if (collection == null || collection.size() == 0) {
throw new Exception("Collection is null or is empty!");
}
for (T t : collection) {
try {
this.put(t);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

/**
* @author Vic.Chu
* @param t
* @throws InterruptedException
* Put a data element into the queue, await the thread to process.
*/
private void put(T t) throws InterruptedException {
lock.lock();
try {
if (queue.size() >= defaultQueueSize) {
notFull.await();
} else {
notEmpty.signal();
Thread.sleep(this.put_warttingMillis);
queue.add(t);
}
} finally {
lock.unlock();
}
}

/**
* @author Vic.Chu
* @return
* @throws InterruptedException
* Take a data element from the queue and destroy this data element in the queue.
*/
private T take() throws InterruptedException {
lock.lock();
try {
if (queue.size() == 0) {
notEmpty.await();
return null;
} else {
notFull.signal();
Thread.sleep(this.take_waittingMillis);
T t = queue.getFirst();
queue.removeFirst();
return t;
}
} finally {
lock.unlock();
}
}

/**
* @author Vic.Chu
* @return
* Get data elements count in the queue.
*/
public Integer currentQueueSize () {
return queue.size();
}

/**
* @author Vic.Chu
* @return
* Get this thread pool's size.
*/
public Integer poolSize () {
return this.defaultPoolSize;
}

/**
* @author Vic.Chu
* @return
* Get this queue's size
*/
public Integer queueSize () {
return this.defaultQueueSize;
}

/**
* test
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
ThreadPool<String> tp = new ThreadPool<String>(5, 5, 0L, 0L) {
@Override
public String doProcess(String t) {
System.out.println("current process is "
+ Thread.currentThread().getName());
System.out.println(t);
return t;
}
};
tp.start();
tp.putCollections(Arrays.asList(new String[]{"s","t","r","i","n","g"}));
}
}
OpenClaw小白安装全攻略:5000字详解,3分钟上手 为什么值得装 OpenClaw?最近科技圈爆火的 OpenClaw(昵称 “小龙虾”),不是普通 AI 聊天工具 —— 它是能本地部署、直接操控电脑的 AI 智能体,相当于给电脑配了个 “全能助手”:整理文件、自动搜资料、写文档、控制浏览器,甚至对接微信 / 飞书发消息,全程不用手动操作。更关键的是:它免费开源、支持全平台,新手不用懂代码,复制粘贴命令就能装,数据存在本地不泄露隐私。截至 2026 年 3 月,GitHub 星标已破 25 万,券商都出研报推荐,上班族、学生党用它提升效率超香! 阅读详情

相关推荐

EPLAN二次开发实战:从API接口到定制化功能的完整指南

本文为电气工程师和自动化设计师提供了一份EPLAN二次开发的完整实战指南。文章详细介绍了从脚本、插件到独立程序三种开发模式,重点讲解了如何使用C#或VB.NET通过API接口操作EPLAN数据模型,实现定制化功能以提升设计效率,并分享了开发环境搭建、调试及项目打包分发的避坑经验。

c6d7e8f9g的博客 1125

java线程池ThreadPoolExecutor类使用详解

在《阿里巴巴java开发手册》中指出了线程资源必须通过线程池提供,不允许在应用中自行显示的创建线程,这样一方面是线程的创建更加规范,可以合理控制开辟线程的数量;另一方面线程的细节管理交给线程池处理,优化了资源的开销。而线程池不允许使用Executors去创建,而要通过ThreadPoolExecutor方式,这一方面是由于jdk中Executor框架虽然提供了如newFixedThrea...

dianyuzhi7625的博客 1423

Modkit

Nmod- 通过过滤器分类为具有指定碱基修饰的残基的调用数量。Ncanonical- 通过过滤器分类为未修饰的碱基的调用数量。确切的碱基必须通过修饰代码推断。例如,如果修饰代码是m(5mC),则未修饰的碱基是胞嘧啶。如果修饰代码是a,则未修饰的碱基是腺苷。Nother mod- 通过过滤器分类为修饰的调用数量,但修饰不同于列出的碱基(且相应的未修饰碱基相同)。例如,对于给定的胞嘧啶,可能有 3 个读取带有h调用,1 个带有未修饰调用,2 个带有m调用。在h的 bedMethyl 行中,N。

生物信息学 1267

【多线程】线程池中的队列有哪些,应该如何选择

线程池中的队列是线程池的重要组成部分,用于存放待执行的任务。在Java中,线程池常用的队列类型包括无界队列、有界队列、直接提交队列(SynchronousQueue)、优先级队列等。

qq_39666711的博客 4789

Visual Studio 2022与Qt集成实战:解决Qt.props导入错误的完整指南

本文详细解析了在Visual Studio 2022中集成Qt开发时,如何解决因Qt.props文件导入失败导致的编译错误。文章从问题根源入手,深入剖析了Qt.props文件与QtMsBuild环境变量的关系,并提供了从检查文件存在性、配置环境变量到直接修改项目文件路径的完整排查与修复方案,帮助开发者快速恢复项目构建。

wdx01234567的博客 676

OpenGL纹理贴图

OpenGL纹理1. 基本概念2. 纹理环绕方式3. 纹理过滤3.1 GL_NEAREST3.2 GL_LINEAR3.3 多级渐远纹理 (Mipmap)4. 纹理加载与创建4.1 纹理加载4.2 纹理创建4.3 纹理的使用 1. 基本概念 纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来表示物体的细节特征,希望绘制一个有足够多细节的物体,当然可以用足够多的顶点颜色来描述,但是无疑也增加了许多额外的开销;另一种办法就是使用纹理。 学习之前先展示一张实现的纹理图以更好理解纹理! 还是这张图为了将纹

牵LV小猪精的博客 8931

线程队列

线程队列有两种, concurrentLinkedQueue,非阻塞队列,内部使用锁实现 BlockingQueue,阻塞队列,满了就等待 package learn.thread0301; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; public class Concurrent...

weixin_41843757的博客 1027

饥荒联机版Mod开发——modmain环境与API深度解析

本文深入解析饥荒联机版Mod开发中的modmain.lua环境与核心API,详细讲解环境表构建原理、API注册与调用时机,并提供高级开发技巧与最佳实践。通过源码分析和实际案例,帮助开发者掌握Mod开发核心技术,解决常见问题,提升开发效率与代码质量。

weixin_30312563的博客 437

线程池参数及队列

线程池中各个参数的含义 参数名 含义 corePoolSize 核心线程数 maximumPoolSize 最大线程数 keepAliveTime+时间单位 空闲线程的存活时间 workQueue 用于存放任务的队列 threadFactory 线程工厂、用来创建新线程 handler 处理别拒绝的任务 corePoolSize是核心线程数,也就是常驻线程池的线程数量,与它对应的是maximumPoolSize,表示线程线程池最大线程数量,当任务特别多对而corePo

qq_39408435的博客 2675

CXL协议-第三章 CXL事务层

CXL.io为I/O设备提供了一个非一致的负载/存储接口。图3-1显示了Flex总线分层层次结构中的位置。事务类型、事务分组格式、基于信用的流量控制、虚拟通道管理和事务排序规则遵循PCIe*定义,详情请参考PCIe基础规范的“事务层规范”章节。本章重点介绍了用于CXL.io的著名的PCIe操作模式或特性。

qq_41305217的博客 2771

基于生存结局(生存分析/COX回归)的中介效应分析

① 建立观察变量OVB和中介变量MVB的回归模型(注意:这里根据mediation包的介绍,需要构建的是probit模型,而不是logist回归模型,网上有很多的代码用的logistic回归,结果自己跑的时候发现报错,我在这里陷了很久;为了方便演示,我们生成了一个协变量(Age)、一个连续型观察变量(liaOVC)、一个二分类观察变量(OVB)、一个连续型中介变量(MVC)、一个二分类中介变量(MVB)以及最后的结局变量(生存时间[time],生存结局[stats])。

m0_61863309的博客 1万+

简析SynchronousQueue,LinkedBlockingQueue,ArrayBlockingQueue

SynchronousQueue SynchronousQueue是无界的,是一种无缓冲的等待队列,但是由于该Queue本身的特性,在某次添加元素后必须等待其他线程取走后才能继续添加;可以认为SynchronousQueue是一个缓存值为1的阻塞队列,但是 isEmpty()方法永远返回是true,remainingCapacity() 方法永远返回是0,remove()和removeAll() 方法永远返回是false,iterator()方法永远返回空,peek()方法永远返回null。

qq_40603010的博客 1365

业态即战场:零售平台的生意模型与系统设计解构

在这篇文章中,我们从“控货、自营、联营”三种典型零售业态出发,拆解了亚马逊、阿里、京东和本地闪购平台在商品模型设计上的差异与博弈。看似简单的卖货方式背后,其实是平台在“控货权”“商品归属权”上的深层策略博弈:谁掌控商品,谁就掌控数据、流量与利润分配权。本文尝试用一套通俗但不失专业的方式,帮助产品经理和技术伙伴读懂零售平台商品模型的底层逻辑与系统设计演化路径。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 13万+

java线程池队列

适用于大部分常见的线程池场景,灵活且通用。:当你需要限制队列大小时,它是一个很好的选择。:在对任务处理有非常严格要求的高并发场景中非常有效。这三种队列类型是最常见的,其他类型如和DelayQueue通常在特定的应用场景下使用。

m0_63197684的博客 1298

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

线程池队列问题

1. 概述 我们这里的队列都指线程池使用的阻塞队列 BlockingQueue 的实现。 什么是有界队列?就是有固定大小的队列。比如设定了固定大小的 LinkedBlockingQueue,又或者大小为 0,只是在生产者和消费者中做中转用的 SynchronousQueue。 什么是无界队列?指的是没有设置固定大小的队列。这些队列的特点是可以直接入列,直到溢出。当然现实几乎不会有到这么大的容量(超过 Integer.MAX_VALUE),所以从使用者的体验上,就相当于 “无界”。比如没有设定固定大小的 Li

夏天 2563

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

线程池中的四种队列类型及其对线程池配置的影响

队列类型队列容量核心线程数的变化最大线程数的变化无界队列(无限制核心线程数会保持在,只有在负载过高时会创建新线程。线程池可以创建新线程,直到达到。如果达到最大线程数,任务会根据拒绝策略处理。有界队列(有限容量如果核心线程空闲,任务将由核心线程处理。队列已满时不会创建新线程,任务会阻塞。线程池会创建新线程直到达到,如果达到最大线程数,新的任务会根据拒绝策略处理。优先级队列(无限制与其他队列相同,核心线程数会在负载过高时创建。线程池会创建新线程直到达到,并且新任务的优先级会影响处理顺序。

huachangzai的博客 1291

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

线程池中阻塞队列有那些,该如何使用

本文介绍了阻塞队列和线程池的使用。阻塞队列在多线程中实现了高效的数据传输,支持自动阻塞和唤醒机制。文章详细讲解了BlockingQueue的核心方法,包括插入、移除和检查操作。在线程池部分,阐述了核心参数配置、工作流程及常见线程池类型(如FixedThreadPool、CachedThreadPool等)。最后强调应避免使用原生Executors创建线程池,以防止OOM风险,推荐自定义ThreadPoolExecutor,合理设置队列容量和拒绝策略。通过合理应用这些并发工具,可以构建高质量的多线程程序。

qq_52445645的博客 1105

线程池常用的阻塞队列有哪些?

线程池常用的阻塞队列有哪些? 文章目录线程池常用的阻塞队列有哪些?1.线程池的内部结构2.阻塞队列3.LinkedBlockingQueue4.SynchronousQueue5.DelayedWorkQueue6.参考 1.线程池的内部结构 线程池内部由四部分组成 第一部分是线程池管理器,主要负责管理线程池的创建、销毁、添加任务等管理操作。 第二部分是工作线程,它又分为核心工作线程和非核心工作线程。 第三部分是任务队列,作为一种缓冲机制,会将超过核心线程数的任务放到任务队列中,等待执行;由于

谢文峰的博客 9455

Java-五种线程池,四种拒绝策略,三类阻塞队列

Java-五种线程池,四种拒绝策略,三种阻塞队列 三种阻塞队列: BlockingQueue&lt;Runnable&gt; workQueue = null; workQueue = new ArrayBlockingQueue&lt;&gt;(5);//基于数组的先进先出队列,有界 workQueue = new LinkedBlockingQueue&lt;&gt;...

草青工作室 的专栏 2万+

java线程池队列大小_JAVA线程池中队列与池大小的关系

JAVA线程池中队列与池大小的关系JAVA线程中对于线程池(ThreadPoolExecutor)中队列,池大小,核心线程的关系写出自己的理解:1:核心线程:简单来讲就是线程池中能否允许同时并发运行的线程的数量2:线程池大小:线程池中最多能够容纳的线程的数量。3:队列:对提交过来的任务的处理模式。对于线程池与队列的交互有个原则:如果队列发过来的任务,发现线程池中正在运行的线程的数量小于核心线程,则...

weixin_42299125的博客 2725

Java队列、线程池及ThreadPoolExecutor自定义线程池实现

Java队列、线程池及ThreadPoolExecutor自定义线程池实现

一恍过去 1万+

线程池 redis队列

我整理的一些关于【队列】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://d.51cto.com/bLN8S1实现线程池与Redis队列的详解 在现代的系统架构中,使用线程池和Redis队列来管理任务是非常常见的做法。本文将指导刚入行的小白如何实现“线程池与Redis队列”的功能。我们将通过一系列步骤...

weixin_40200569的博客 183

Java 线程池内存队列满了怎么办?

Java 线程池内存队列打满了,你怎么办?

JavaJasper的博客 3645

线程池和队列学习,队列在线程池中的使用,什么是队列阻塞,什么是有界队列

一,线程池 首先了解线程池整个框架 1,这里记住最核心的类是ThreadPoolExecutor 2,在ExecuorService中提供了newSingleThreadExecutor,newFixedThreadPool,newCacheThreadPool,newScheduledThreadPool四个方法,这四个方法返回的类型是ThreadPoolExecutor。 3,这...

小爷欣欣 2330

JAVA线程池有哪些队列? 以及它们的适用场景案例

不同的线程池队列有着各自的特点和适用场景,在实际使用线程池时,需要根据具体的业务需求、系统资源状况以及对任务执行顺序、响应时间等方面的要求,合理选择相应的队列来构建线程池,以实现高效的任务处理。关注威哥爱编程,学习编程不迷茫,关注威哥爱编程,代码世界任纵横。

威哥爱编程,华为 HDE,鸿蒙极客、优快云博客专家、《鸿蒙 HarmonyOS 5/6 开发之路》系列图书第一作者 1566

阐述线程池中的任务队列

阐述线程池中的任务队列

J_bean的博客 5613
上一篇: eclipse 使用
下一篇: 模拟简单的 spring component scan
vortex331
博客等级 码龄16年 0粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值