java如何自定义一个线程池
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如何自定义一个线程池的更多相关文章
- 二 Java利用等待/通知机制实现一个线程池
接着上一篇博客的 一Java线程的等待/通知模型 ,没有看过的建议先看一下.下面我们用等待通知机制来实现一个线程池 线程的任务就以打印一行文本来模拟耗时的任务.主要代码如下: 1 定义一个任务的接口 ...
- 死磕 java线程系列之自己动手写一个线程池
欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写 ...
- 死磕 java线程系列之自己动手写一个线程池(续)
(手机横屏看源码更方便) 问题 (1)自己动手写的线程池如何支持带返回值的任务呢? (2)如果任务执行的过程中抛出异常了该怎么处理呢? 简介 上一章我们自己动手写了一个线程池,但是它是不支持带返回值的 ...
- Java多线程-新特性-线程池
Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定可靠的多线程程序 ...
- java多线程之 Executors线程池管理
1. 类 Executors 此类中提供的一些方法有: 1.1 public static ExecutorService newCachedThreadPool() 创建一个可根据需要创建新线程的线 ...
- [转] 引用 Java自带的线程池ThreadPoolExecutor详细介绍说明和实例应用
PS: Spring ThreadPoolTaskExecutor vs Java Executorservice cachedthreadpool 引用 [轰隆隆] 的 Java自带的线程池Thre ...
- java 线程之executors线程池
一.线程池的作用 平时的业务中,如果要使用多线程,那么我们会在业务开始前创建线程,业务结束后,销毁线程.但是对于业务来说,线程的创建和销毁是与业务本身无关的,只关心线程所执行的任务.因此希望把尽可能多 ...
- java高并发之线程池
Java高并发之线程池详解 线程池优势 在业务场景中, 如果一个对象创建销毁开销比较大, 那么此时建议池化对象进行管理. 例如线程, jdbc连接等等, 在高并发场景中, 如果可以复用之前销毁的对 ...
- Java并发编程:线程池ThreadPoolExecutor
多线程的程序的确能发挥多核处理器的性能.虽然与进程相比,线程轻量化了很多,但是其创建和关闭同样需要花费时间.而且线程多了以后,也会抢占内存资源.如果不对线程加以管理的话,是一个非常大的隐患.而线程池的 ...
随机推荐
- 手摸手教你在vue-cli里面使用vuex,以及vuex简介
写在前面: 这篇文章是在vue-cli里面使用vuex的一个极简demo,附带一些vuex的简单介绍.有需要的朋友可以做一下参考,喜欢的可以点波赞,或者关注一下,希望可以帮到大家. 本文首发于我的个人 ...
- Flex布局做出自适应页面--语法和案例
本文发布在: github项目地址:https://github.com/tenadolanter/flex-layout-demo SegmentFault地址:https://segmentfau ...
- 小程序自定义switch组件
如上图,小程序api中的switch组件只能自定义颜色,不能自定义宽高,所以就开始了自己写switch组件. 自定义组件样式 switch组件样式大致如图,样式思路:未选中时为一个长方形有圆角按钮,和 ...
- Ansible-安装配置
主机规划 主机名称 操作系统版本 内网IP 外网IP(模拟) 安装软件 ansi-manager CentOS7.5 172.16.1.180 10.0.0.180 ansible ansi-hapr ...
- 微信WXSS样式文件
目录 WXSS官方文档 1. WXSS 1.1. 尺寸单位 1.2. 样式导入 1.3. 内联样式 1.4. 选择器 1.5. 全局样式与局部样式 WXSS官方文档 https://developer ...
- java线程间的共享
本次内容主要讲synchronized.volatile和ThreadLocal. 1.synchronized内置锁 线程开始运行,拥有自己的栈空间,就如同一个脚本一样,按照既定的代码一步一步地执行 ...
- 2018-05-04 圣杯布局 and 双飞翼布局,display:flex
看到一个神奇的布局,啥都不说了 直接贴代码 要让main在中间,left在左边,可以通过Flex容器下的项目的属性“order”属性来设置:对于order属性:定义项目的排列顺序,越小越靠前,默认为0 ...
- 使用NPOI将Excel表导入到数据库中
public string ExcelFile() { //指定文件路径, string fileName=@"d:\Stu.xls"; //创建一个文件流,并指定其中属性 usi ...
- 10个机器学习人工智能开发框架和AI库(优缺点对比表)/贪心学院
概述 通过本文我们来一起看一些用于人工智能的高质量AI库,它们的优点和缺点,以及它们的一些特点. 人工智能(AI)已经存在很长时间了.然而,由于这一领域的巨大进步,近年来它已成为一个流行语.人工智能曾 ...
- vue项目 github 上传项目并链接地址
git init git init: 通过命令git init把这个文件夹变成Git可管理的仓库git status git status:查看当前仓库状态 git add . 这里提示你虽然把项目粘 ...