public class DefaultThreadPool implements ThreadPool{//线程池最大限制数

private static final int MAX_WORKER_NUMBERS = 10;//线程池默认的数量

private static final int DEFAULT_WORKER_NUMBERS= 5;//线程池最小数量

private static final int MIN_WORKER_NUMBERS = 1;//这是一个任务列表,将会向里面插入任务

private final LinkedList jobs = new LinkedList() ;//工作者列表

private final List workers = Collections.synchronizedList(new ArrayList()) ;//工作者线程的数量

private int workerNum =DEFAULT_WORKER_NUMBERS ;//线程编号生成

private AtomicLong threadNum = newAtomicLong() ;publicDefaultThreadPool(){

initializeWorkers(DEFAULT_WORKER_NUMBERS);

}public DefaultThreadPool(intinitSize){

workerNum= initSize > MAX_WORKER_NUMBERS ?MAX_WORKER_NUMBERS :

initSize< MIN_WORKER_NUMBERS ?MIN_WORKER_NUMBERS : initSize ;

initializeWorkers(workerNum);

}private void initializeWorkers(intnum){for(int i = 0 ; i < num ; i++){

Worker worker= newWorker() ;

workers.add(worker) ;

Thread t= new Thread(worker, "ThreadPool-worker-"+threadNum.incrementAndGet()) ;

t.start();

}

}

@Overridepublic voidexecute(Task task) {if(task!=null){synchronized(jobs){

jobs.addLast(task);//通知

jobs.notify();

}

}

}

@Overridepublic voidshutdown() {for(Worker worker : workers){

worker.shutdown();

}

}

@Overridepublic void addWorker(intnum) {//这里是否应该选择workers为监视器锁

synchronized(workers){//判断新增的数量是否超出线程池的内置规则

if(num+this.workerNum >MAX_WORKER_NUMBERS){

num= MAX_WORKER_NUMBERS - this.workerNum ;

}

initializeWorkers(num);this.workerNum +=num ;

}

}

@Overridepublic void removeWorker(intnum) {synchronized(workers){if(num >= this.workerNum){throw new IllegalArgumentException("beyond workNum") ;

}for(int i = 0 ; i < num ; i++){

Worker worker=workers.get(i);if(workers.remove(worker)){

worker.shutdown();

}

}this.workerNum -=num ;

}

}

@Overridepublic intgetTaskSize() {returnjobs.size();

}class Worker implementsRunnable{private volatile booleanrunning ;

@Overridepublic voidrun() {while(running){

Task job= null;synchronized(jobs){//如果任务列表是空的,那么就wait

if(jobs.isEmpty()){try{

jobs.wait();

}catch(InterruptedException e) {//感知到外部对WorderThread的中断操作。返回

Thread.currentThread().interrupt();return;

}

}

job=jobs.removeFirst() ;

}if(job!=null){try{

job.run();

}catch(Exception e) {//忽略job执行中的exception

}

}

}//while end

}//run end

public voidshutdown(){

running= false;

}

}

}

java 线程池技术_Java线程池技术以及实现相关推荐

  1. java 连接池技术_java数据库连接池技术原理(浅析)

    在执行数据库SQL语句时,我们先要进行数据连接:而每次创建新的数据库的连接要消耗大量的资源,这样,大家就想出了数据库连接池技术.它的原理是,在运行过程中,同时打开着一定数量的数据库连接,形成数据连接池 ...

  2. java io密集型任务_Java线程池讲解——针对IO密集型任务

    sap java开发技术详解&mdash基础 94.01元 (需用券) 去购买 > 针对 IO 密集型的任务,我们可以针对原本的线程池做一些改造,从而可以提高任务的处理效率. 基本 在阿 ...

  3. java线程不执行_java线程池,阿里为什么不允许使用Executors?

    带着问题 阿里Java代码规范为什么不允许使用Executors快速创建线程池? 下面的代码输出是什么? ThreadPoolExecutor executor = new ThreadPoolExe ...

  4. java 对象池 实现_Java对象池技术的原理及其实现

    看到一片有关于java 对象基础知识,故转载一下,同时学习一下. 摘 要 本文在分析对象池技术基本原理的基础上,给出了对象池技术的两种实现方式.还指出了使用对象池技术时所应注意的问题. 关键词 对象池 ...

  5. java new thread参数_java线程池01-ThreadPoolExecutor构造方法参数的使用规则

    为了更好的使用多线程,JDK提供了线程池供开发人员使用,目的在于减少线程的创建和销毁次数,以此达到线程的重复利用. 其中ThreadPoolExecutor是线程池中最核心的一个类,我们先简单看一下这 ...

  6. java线程池执行器_Java线程池ThreadPoolExecutor的使用

    Java线程池ThreadPoolExecutor的使用 ThreadPoolExecutor就是我们用来实现线程的一个执行器,它实现了Excutor和ExecutorService接口.Excuto ...

  7. java 线程池数量_java线程池及创建多少线程合适

    java线程池 1.以下是ThreadPoolExecutor参数完备构造方法: public ThreadPoolExecutor(int corePoolSize,int maximumPoolS ...

  8. java线程池概念_Java 线程池概念、原理、简单实现

    线程池的思想概述 我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结東了,这样频繁创建线程就会大大降低系 ...

  9. java线程池功能_Java线程池总结

    一.线程池 线程池适合处理的任务:执行时间短.工作内容较为单一. 合理使用线程池带来的好处: 1)降低资源消耗:重复利用已创建的线程降低线程创建和销毁造成的开销 2)提高响应速度:当任务到达时,任务可 ...

  10. java线程池中断处理_Java线程中断机制

    1. 引言 对Java中断没有一个全面的了解,可能会误以为被中断的线程将立马退出运行,但事实并非如此.中断机制是如何工作的?捕获或检测到中断后,是抛出InterruptedException还是重设中 ...

最新文章

  1. 【c语言】蓝桥杯算法提高 一元一次方程
  2. PHP之高性能I/O框架:Libevent(二)
  3. 浅析Web2.0技术
  4. Python单引号、双引号和三双引号的区别
  5. boost::mpl模块实现erase相关的测试程序
  6. C++初始化和关闭roscpp节点
  7. POJ - 3189 Steady Cow Assignment(二分图多重匹配)
  8. 浪里个浪 FZU - 2261
  9. 尼康相机报错err_数码相机遇到这12种错误,自己动手就能解决,再不用找人维修...
  10. L2-1 包装机 (25 分)
  11. matlab编写全置信度函数,Matlab_curve_fitting_tool的用法图文结合
  12. Quartus II 与ModelSim-Altera联合仿真PLL
  13. ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or
  14. mapboxgl 互联网地图纠偏插件(二)
  15. Windows扫雷游戏python
  16. 我的团长我的团第二十四集
  17. 金融级云服务 平安云赋能保险业创新发展
  18. app式成语_app的成语都有什么?
  19. 代码中出现的奇怪问题原因
  20. 小白前端学习流程【爱创课堂专业前端培训】

热门文章

  1. android 年月日时分秒控件,Android 年月日时分秒时间选择器
  2. catia钣金根据线段折弯_钣金折弯加工注意事项有哪些?钣金折弯要点介绍
  3. broker可以禁用吗 time_Win8.1系统Runtime Broker是什么进程?可以禁用吗?
  4. mysql 主主模式优缺点_mysql主主同步模式
  5. 第一类修正贝塞尔函数的C语言实现
  6. php检测一个变量是否设置函数,php如何判断变量是否有设置的函数
  7. 判断用户名和密码是否正确java_facebook中如何判断用户名和密码是否正确
  8. python gui编程 从入门到项目实战_python GUI编程 QT5开发项目实战
  9. NOIP模拟测试24「star way to hevaen·lost my music」
  10. [Java开发]打印当前路径到控制台