线程池为什么要有它:

线程创建要开辟虚拟机栈,释放线程要垃圾回收的。

server端要并发访问数据库的。

服务器启动有线程池放着。

-----

线程池的概念:

1.任务队列

2.拒绝策略(抛出异常,直接丢弃,阻塞,放在临时队列)

3.初始化值init(min),初始线程池大小

3.active

5.max线程池线程的最大个数

min<=active<=max

quartz:定时任务

代码:

package chapter13;

import java.util.ArrayList;

import java.util.LinkedList;

import java.util.List;

public class SimpleThreadPoolMy {

private final int size;

private final static int DEFAULT_SIZE = 10;

private static volatile int seq = 0;

private final static String THREAD_PREFIX = "SIMPLE_THREAD_POOL-";

private final static ThreadGroup GROUP = new ThreadGroup("Pool_Group");

private final static List<WorkerTask> THREAD_QUEUE = new ArrayList<>();

/**

* task queue

*/

private final static LinkedList<Runnable> TASK_QUEUE = new LinkedList<>();

public SimpleThreadPoolMy() {

this(DEFAULT_SIZE);

}

public SimpleThreadPoolMy(int size) {

this.size = size;

init();

}

private void init() {

for (int i = 0; i < size; i++) {

createWorkTask();

}

}

private void createWorkTask() {

WorkerTask task = new WorkerTask(GROUP, THREAD_PREFIX + (seq++));

task.start();

THREAD_QUEUE.add(task);

}

private enum TaskState {

FREE, RUNNING, BLOCKEED, DEAD

}

public void submit(Runnable runnable) {

synchronized (TASK_QUEUE) {//别的方法有读的操作,这里有写的操作,所以你要加锁的

TASK_QUEUE.addLast(runnable);

TASK_QUEUE.notifyAll();

}

}

/**

* Thread in ThreadPool

*/

private static class WorkerTask extends Thread {//为什么定义为private呢就是为了不想让别人知道我是什么

private volatile TaskState taskState = TaskState.FREE;

public WorkerTask(ThreadGroup group, String name) {//构造方法,调用了Thread的构造

super(group, name);

}

public TaskState getTaskState() {

return this.taskState;

}

public void close() {

this.taskState = TaskState.DEAD;

}

public void run() {//重写外汇返佣保证执行完之后不能挂掉

OUTER:

while (this.taskState != TaskState.DEAD) {//当前的线程没有死掉

Runnable runnable;

synchronized (TASK_QUEUE) {//去任务队列调取任务

while (TASK_QUEUE.isEmpty()) {

try {

taskState = TaskState.BLOCKEED;

TASK_QUEUE.wait();//没有任务就释放锁,这个线程在TASK_QUEUE上等待 wait会被打断  打断的话就break出来

} catch (InterruptedException e) {

break OUTER;//https://blog.csdn.net/zhaoheng2017/article/details/78385973  被打断了就接着去调取任务

}

}

runnable = TASK_QUEUE.removeFirst();//队列 先进先出 任务队列只被消费一次 比如数据库线程池,取出来我执行连接就可以了

}

if (runnable != null) {

taskState = TaskState.RUNNING;

runnable.run();

taskState = TaskState.FREE;

}

}

}

}

}

原文链接:https://blog.csdn.net/qq_28764557/article/details/103575987

java编程实战的更多相关文章

  1. Java编程实战宝典PDF (中文版带书签)

    Java编程实战宝典PDF 目录 第1篇 Java基础知识入门第1章 Java的开发运行环境( 教学视频:57分钟)1.1 Java运行原理与Java虚拟机1.1.1 Java运行原理简述1.1.2 ...

  2. 【Java编程实战】Metasploit_Java后门运行原理分析以及实现源码级免杀与JRE精简化

    QQ:3496925334 文章作者:MG1937 CNBLOG博客ID:ALDYS4 未经许可,禁止转载 某日午睡,迷迷糊糊梦到Metasploit里有个Java平台的远控载荷,梦醒后,打开虚拟机, ...

  3. redis3.0 集群实战3 - java编程实战

    本文主要描述使用jedis进行redis-cluster操作   jedis jedis是redis官方推荐使用的java redis客户端,github地址为,https://github.com/ ...

  4. 【Java并发编程实战】----- AQS(四):CLH同步队列

    在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...

  5. 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport

    在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...

  6. 【Java并发编程实战】----- AQS(二):获取锁、释放锁

    上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ...

  7. 【Java并发编程实战】-----“J.U.C”:Exchanger

    前面介绍了三个同步辅助类:CyclicBarrier.Barrier.Phaser,这篇博客介绍最后一个:Exchanger.JDK API是这样介绍的:可以在对中对元素进行配对和交换的线程的同步点. ...

  8. 【Java并发编程实战】-----“J.U.C”:CountDownlatch

    上篇博文([Java并发编程实战]-----"J.U.C":CyclicBarrier)LZ介绍了CyclicBarrier.CyclicBarrier所描述的是"允许一 ...

  9. 【Java并发编程实战】-----“J.U.C”:CyclicBarrier

    在上篇博客([Java并发编程实战]-----"J.U.C":Semaphore)中,LZ介绍了Semaphore,下面LZ介绍CyclicBarrier.在JDK API中是这么 ...

随机推荐

  1. 20180705-Java基础语法

    Java基础语法 一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如,一条 ...

  2. 北风设计模式课程---备忘录(Memento)模式

    北风设计模式课程---备忘录(Memento)模式 一.总结 一句话总结: 备忘录模式也是一种比较常用的模式用来保存对象的部分用于恢复的信息,和原型模式有着本质的区别,广泛运用在快照功能之中.同样的使 ...

  3. DB-MD:MD/主数据

    ylbtech-DB-MD:MD/主数据 主数据(MD Master Data)指系统间共享数据(例如,客户.供应商.账户和组织部门相关数据).与记录业务活动,波动较大的交易数据相比,主数据(也称基准 ...

  4. 软件-JMeter:JMeter 百科

    ylbtech-软件-JMeter:JMeter 百科 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到 ...

  5. Mybatis入门之MyBatis基础

    一.MyBatis概述 1.ORM模型简介 ORM:对象关系映射(Object Relation Mapping) 1)传统JDBC程序的设计缺陷(实际项目不使用) a.大量配置信息硬编码 b.大量的 ...

  6. Jquery浅析

    目录 jquery 通过jquery改变标签字体颜色 jquery和js对象之间值转化 Jquery基本选择器 Jquery层级选择器 基本筛选器 操作类属性 模太框 表单筛选器 筛选器方法 设置多个 ...

  7. jmeter之集合点的使用

    通过jmeter并不能1秒立即达到某一并发,这时候,可以通过集合点来实现,达到某一并发时,然后再一起执行某一动作,仅作用于第一次动作的时候 目录 1.集合点元件 2.简单的概念介绍 1.集合点元件 集 ...

  8. delphi idhttpserver 服务器

    [冒泡]lazarus(964489899) 10:01:27 哥 能复制成 字符串吗?   [冒泡]lazarus(964489899) 10:01:44 我想快速输入一下   [传说]CHINY( ...

  9. pandas向左移动非空单元格

    碰到个小问题, 因为需要更改excel 的行为. 处理最多的还是excel的事, 不过看起来是excel.实际上对pandas 的库的熟悉.读取,更改,应用等等,方法. 十分有用. 先说需求,本来的表 ...

  10. sysbench - 数据库功能及性能测试工具

    sysbench 的 GitHub 参考资料 1.0 之后的版本使用方法跟之前的有所区别,下面所有内容基于 1.0.9 版本. 另外,为了方便管理测试,最好不要通过命令直接运行测试,而是写成脚本自动化 ...