java线程池的一些简单功能,后续会更新,代码不多,很好理解

package com.rbac.thread;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.TimeUnit; /**
* 自定义线程池
*
* @author xl,lang
*
*/
public class MyExecutorService {
// 初始化线程
protected List<InitThread> initThreads; // 执行任务列表
protected BlockingQueue<Runnable> taskQueues; // 线程执行状态
protected volatile boolean threadState = true; /*
* // 当前线程的活跃数 public AtomicInteger activeCount; public Lock lock=new
* ReentrantLock(); // 最小活跃数 public int threadMinSize = 0; // 最大线程数 public
* int threadMaxSize = 0; // 初始话线程数 public int threadInitSize = 0;
*/ /**
* 线程初始化方法
*
* @param threadMaxSize
* @param threadInitSize
* @param taskQueueSize
*/
/*
* public MyExecutorService(int threadMaxSize, int threadMinSize, int
* threadInitSize, int taskQueueSize) { this.taskQueues = new
* LinkedBlockingDeque<Runnable>(taskQueueSize); if (threadInitSize > 0 &&
* threadInitSize < threadMaxSize) { this.initThreads = new ArrayList<>();
* for (int i = 0; i < threadInitSize; i++) { InitThread init = new
* InitThread(); init.start(); initThreads.add(init); }
*
* }
*
* }
*/ /**
* 线程初始化方法
*
* @param threadMaxSize
* @param threadInitSize
* @param taskQueueSize
*/
public MyExecutorService(int threadInitSize, int taskQueueSize) {
this.taskQueues = new LinkedBlockingDeque<Runnable>(taskQueueSize);
if (threadInitSize > 0) {
this.initThreads = new ArrayList<>();
for (int i = 0; i < threadInitSize; i++) {
InitThread init = new InitThread();
init.start();
initThreads.add(init);
} } } // 添加任务
public boolean exeute(Runnable task) throws InterruptedException { return this.taskQueues.offer(task, 60, TimeUnit.SECONDS);
} /**
* 初始化线程
*
* @author xl,lang
*
*/
class InitThread extends Thread { @Override
public void run() { while (threadState || taskQueues.size() > 0) {
Runnable runable = taskQueues.poll();
if (null != runable) {
runable.run();
} } } } // 关闭线程池
public void shutdown() {
this.threadState = false;
} public static void main(String[] args) { MyExecutorService es = new MyExecutorService(2, 5);
for (int i = 0; i < 100; i++) {
final int a = i;
try {
es.exeute(new Runnable() { @Override
public void run() {
System.out.println(Thread.currentThread().getName() + "执行" + a); }
});
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
es.shutdown(); }
}

java如何自定义一个线程池的更多相关文章

  1. 二 Java利用等待/通知机制实现一个线程池

    接着上一篇博客的 一Java线程的等待/通知模型 ,没有看过的建议先看一下.下面我们用等待通知机制来实现一个线程池 线程的任务就以打印一行文本来模拟耗时的任务.主要代码如下: 1  定义一个任务的接口 ...

  2. 死磕 java线程系列之自己动手写一个线程池

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写 ...

  3. 死磕 java线程系列之自己动手写一个线程池(续)

    (手机横屏看源码更方便) 问题 (1)自己动手写的线程池如何支持带返回值的任务呢? (2)如果任务执行的过程中抛出异常了该怎么处理呢? 简介 上一章我们自己动手写了一个线程池,但是它是不支持带返回值的 ...

  4. Java多线程-新特性-线程池

    Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定可靠的多线程程序 ...

  5. java多线程之 Executors线程池管理

    1. 类 Executors 此类中提供的一些方法有: 1.1 public static ExecutorService newCachedThreadPool() 创建一个可根据需要创建新线程的线 ...

  6. [转] 引用 Java自带的线程池ThreadPoolExecutor详细介绍说明和实例应用

    PS: Spring ThreadPoolTaskExecutor vs Java Executorservice cachedthreadpool 引用 [轰隆隆] 的 Java自带的线程池Thre ...

  7. java 线程之executors线程池

    一.线程池的作用 平时的业务中,如果要使用多线程,那么我们会在业务开始前创建线程,业务结束后,销毁线程.但是对于业务来说,线程的创建和销毁是与业务本身无关的,只关心线程所执行的任务.因此希望把尽可能多 ...

  8. java高并发之线程池

    Java高并发之线程池详解   线程池优势 在业务场景中, 如果一个对象创建销毁开销比较大, 那么此时建议池化对象进行管理. 例如线程, jdbc连接等等, 在高并发场景中, 如果可以复用之前销毁的对 ...

  9. Java并发编程:线程池ThreadPoolExecutor

    多线程的程序的确能发挥多核处理器的性能.虽然与进程相比,线程轻量化了很多,但是其创建和关闭同样需要花费时间.而且线程多了以后,也会抢占内存资源.如果不对线程加以管理的话,是一个非常大的隐患.而线程池的 ...

随机推荐

  1. Swagger2 最全注解说明

    原文链接:https://blog.csdn.net/xiaojin21cen/article/details/78654652 文章目录1.swagger2 注解整体说明2.@Api:请求类的说明3 ...

  2. 峰哥说技术:07-SpringBoot 正好Thymeleaf视图

    Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 07  峰哥说技术:SpringBoot 正好Thymeleaf视图 Spring Boot视图介绍 虽然 ...

  3. Json转化的三种方式

    1. Gson 1.添加依赖 <dependency> <groupId>com.google.code.gson</groupId> <artifactId ...

  4. [日志分析]Graylog2进阶之获取Nginx来源IP的地理位置信息

    如果你们觉得graylog只是负责日志收集的一个管理工具,那就too young too naive .日志收集只是graylog的最最基础的用法,graylog有很多实用的数据清洗和处理的进阶用法. ...

  5. Qt5小Demo之猜数字游戏

    玩法:设定时间进行猜数字,所猜数字为一个四位数,输入自己的数字,系统会提示是大了还是小了,依据条件逐步逼近正确结果.在规定时间里猜对即获胜,否则即失败. 平台支持:Win10下测试正常. 源码地址: ...

  6. winform不能循环引用,使用接口传值到界面

    public partial class frmMain : Form, IFormManager { 4 public frmMain() { InitializeComponent(); 8 } ...

  7. HTML每日学习笔记(1)

    7.15.2019 1.HTML脚本——JavaScript的嵌入使用,使 HTML 页面具有更强的动态和交互性. <script> 标签用于定义客户端脚本,比如 JavaScript. ...

  8. 3D游戏中各种空间变换到底是怎么回事

    每一个游戏可以呈现炫丽效果的背后,需要进行一系列的复杂计算,同时也伴随着各种各样的顶点空间变换.渲染游戏的过程可以理解成是把一个个顶点经过层层处理最终转化到屏幕上的过程,本文就旨在说明,顶点是经过了哪 ...

  9. [Linux][C][gcc][tips] 在头文件中定义变量引发的讨论

    概述 本人的原创文章,最先发表在github-Dramalife-note中.转载请注明出处. Define variable(s) in header file referenced by mult ...

  10. Java 14 发布了,再也不怕 NullPointerException 了!

    2020年3月17日发布,Java正式发布了JDK 14 ,目前已经可以开放下载.在JDK 14中,共有16个新特性,本文主要来介绍其中的一个特性:JEP 358: Helpful NullPoint ...