java编程实战
线程池为什么要有它:
线程创建要开辟虚拟机栈,释放线程要垃圾回收的。
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编程实战的更多相关文章
- Java编程实战宝典PDF (中文版带书签)
Java编程实战宝典PDF 目录 第1篇 Java基础知识入门第1章 Java的开发运行环境( 教学视频:57分钟)1.1 Java运行原理与Java虚拟机1.1.1 Java运行原理简述1.1.2 ...
- 【Java编程实战】Metasploit_Java后门运行原理分析以及实现源码级免杀与JRE精简化
QQ:3496925334 文章作者:MG1937 CNBLOG博客ID:ALDYS4 未经许可,禁止转载 某日午睡,迷迷糊糊梦到Metasploit里有个Java平台的远控载荷,梦醒后,打开虚拟机, ...
- redis3.0 集群实战3 - java编程实战
本文主要描述使用jedis进行redis-cluster操作 jedis jedis是redis官方推荐使用的java redis客户端,github地址为,https://github.com/ ...
- 【Java并发编程实战】----- AQS(四):CLH同步队列
在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...
- 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport
在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...
- 【Java并发编程实战】----- AQS(二):获取锁、释放锁
上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ...
- 【Java并发编程实战】-----“J.U.C”:Exchanger
前面介绍了三个同步辅助类:CyclicBarrier.Barrier.Phaser,这篇博客介绍最后一个:Exchanger.JDK API是这样介绍的:可以在对中对元素进行配对和交换的线程的同步点. ...
- 【Java并发编程实战】-----“J.U.C”:CountDownlatch
上篇博文([Java并发编程实战]-----"J.U.C":CyclicBarrier)LZ介绍了CyclicBarrier.CyclicBarrier所描述的是"允许一 ...
- 【Java并发编程实战】-----“J.U.C”:CyclicBarrier
在上篇博客([Java并发编程实战]-----"J.U.C":Semaphore)中,LZ介绍了Semaphore,下面LZ介绍CyclicBarrier.在JDK API中是这么 ...
随机推荐
- python之面向过程,函数式编程,面向对象浅析
python编程有面向过程.面向函数.面向对象三种,那么他们区别在哪呢?这个问题,让我想起我在学习编程的时候,我的老师给我举的例子.分享给大家. 面向过程就是将编程当成是做一件事,要按步骤完成! 比如 ...
- jmeter(二十):Logic Controller:逻辑控制器(上)
逻辑控制器用来控制采样器(samplers)的执行顺序,根据实际需要定制执行规则.在控制器层级下面的所有的采样器都会当做一个整体,执行时也会一起被执行. Logic Controller种类: 以上L ...
- SqlServer 索引和视图
Ø 索引 1. 什么是索引 索引就是数据表中数据和相应的存储位置的列表,利用索引可以提高在表或视图中的查找数据的速度. 2. 索引分类 数据库中索引主要分为两类:聚集索引和非聚集索引.SQL Serv ...
- vuex基本使用
1.组件之间共享数据的方式 父向子传值:v-bind 属性绑定 子向父传值:v-on 事件绑定 兄弟组件之间共享数据:EventBus $on 接收数据的那个组件 $emit 发送数据的那个组件 2. ...
- mybatis插件机制及分页插件原理
MyBatis 插件原理与自定义插件: MyBatis 通过提供插件机制,让我们可以根据自己的需要去增强MyBatis 的功能.需要注意的是,如果没有完全理解MyBatis 的运行原理和插件的工作方式 ...
- vs code配置C/C++开发环境
第一步:下载 Vs Code 点击链接下载Vs Code 下载版本 并安装 https://code.visualstudio.com/ 点击 Download for Windwos 安装时 如 ...
- spring-第七篇之深入理解容器中的bean
1.抽象bean与子bean 用于指定配置模板. 2.容器中的工厂bean 这种工厂bean必须实现FactoryBean接口,通过spring容器getBean()方法获取它时,容器返回的不是Fac ...
- 解读vue filter
1.全局filter, 全局的过滤一般在main.js里面使用 <div id="app"> <div> {{testVal | filVal(10,30) ...
- 用vue.js写的一个瀑布流的组件
用vue.js写的一个瀑布流的组件:https://segmentfault.com/a/1190000010741319 https://www.jianshu.com/p/db3cadc03402
- dp(过河问题)
http://codeforces.com/gym/101492/problem/E Teamwork is highly valued in the ACM ICPC. Since the begi ...