java架构《并发线程高级篇二》
本章主要记录讲解并发线程的线程池。使用Executor框架自定义线程池。
自定义线程池使用Queue队列所表示出来的形式:
1 ArrayBlockingQueue<Runnable>(3); 有界队列:
2
3 /**
4 * 在使用有界队列时,若有新的任务需要执行,如果线程池实际线程数小于corePoolSize,则优先创建线程,
5 * 若大于corePoolSize,则会将任务加入队列,
6 * 若队列已满,则在总线程数不大于maximumPoolSize的前提下,创建新的线程,
7 * 若线程数大于maximumPoolSize,则执行拒绝策略。或其他自定义方式。
8 */
9
10
11
12 LinkedBlockingQueue(); 无界队列:
13
14 /**
15
16 *当使用无界队列时,MaxSize则无效,只根据corePoolSize大小来创建线程
17
18 */
Executor自定义异常:
自定义异常类并实现RejectedExecutionHandler类
代码分解:
1 public class MyRejected implements RejectedExecutionHandler{
2
3
4 public MyRejected(){
5 }
6
7 @Override
8 public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
9 System.out.println("自定义处理..");
10 System.out.println("当前被拒绝任务为:" + r.toString());
11 }
12
13 }
自定义异常代码解析:
MyTask类实现 Runnable:
1 public class MyTask implements Runnable {
2
3 private int taskId;
4 private String taskName;
5
6 public MyTask(int taskId, String taskName){
7 this.taskId = taskId;
8 this.taskName = taskName;
9 }
10
11 public int getTaskId() {
12 return taskId;
13 }
14
15 public void setTaskId(int taskId) {
16 this.taskId = taskId;
17 }
18
19 public String getTaskName() {
20 return taskName;
21 }
22
23 public void setTaskName(String taskName) {
24 this.taskName = taskName;
25 }
26
27 @Override
28 public void run() {
29 try {
30 System.out.println("run taskId =" + this.taskId);
31 Thread.sleep(5*1000);
32 //System.out.println("end taskId =" + this.taskId);
33 } catch (InterruptedException e) {
34 e.printStackTrace();
35 }
36 }
37
38 public String toString(){
39 return Integer.toString(this.taskId);
40 }
41
42 }
UseThreadPoolExecutor自定义线程池类:
1 public class UseThreadPoolExecutor{
2
3
4 public static void main(String[] args) {
5 /**
6 * 在使用有界队列时,若有新的任务需要执行,如果线程池实际线程数小于corePoolSize,则优先创建线程,
7 * 若大于corePoolSize,则会将任务加入队列,
8 * 若队列已满,则在总线程数不大于maximumPoolSize的前提下,创建新的线程,
9 * 若线程数大于maximumPoolSize,则执行拒绝策略。或其他自定义方式。
10 *
11 */
12 ThreadPoolExecutor pool = new ThreadPoolExecutor(
13 1, //coreSize
14 2, //MaxSize
15 60, //60
16 TimeUnit.SECONDS,
17 new ArrayBlockingQueue<Runnable>(3) //指定一种队列 (有界队列)
18 //new LinkedBlockingQueue<Runnable>()
19 , new MyRejected()
20 //, new DiscardOldestPolicy()
21 );
22
23 MyTask mt1 = new MyTask(1, "任务1");
24 MyTask mt2 = new MyTask(2, "任务2");
25 MyTask mt3 = new MyTask(3, "任务3");
26 MyTask mt4 = new MyTask(4, "任务4");
27 MyTask mt5 = new MyTask(5, "任务5");
28 MyTask mt6 = new MyTask(6, "任务6");
29
30 pool.execute(mt1);
31 pool.execute(mt2);
32 pool.execute(mt3);
33 pool.execute(mt4);
34 pool.execute(mt5);
35 pool.execute(mt6);
36
37 pool.shutdown();
38
39 }
40 }
java架构《并发线程高级篇二》的更多相关文章
- java架构《并发线程高级篇四》
本章主要讲并发线程的常见的两种锁.重入锁和读写锁 一:重入锁(ReentrantLock) 概念:重入锁,在需要进行同步的代码加锁,但最后一定不要忘记释放锁,否则会造成锁永远不能释放,其他线程进不了 ...
- java架构《并发线程高级篇一》
本章主要记录讲解并发线程的线程池.java.util.concurrent工具包里面的工具类. 一:Executor框架: Executors创建线程池的方法: newFixedThreadPool( ...
- java架构《并发线程高级篇三》
本章主要介绍和讲解concurrent.util里面的常用的工具类. 一.CountDownLatch使用:(用于阻塞主线程) 应用场景 :通知线程休眠和运行的工具类,是wait和notify的升级版 ...
- Java高并发 -- 线程池
Java高并发 -- 线程池 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 在使用线程池后,创建线程变成了从线程池里获得空闲线程,关闭线程变成了将线程归坏给线程池. ...
- Java高并发--线程安全策略
Java高并发--线程安全策略 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 不可变对象 发布不可变对象可保证线程安全. 实现不可变对象有哪些要注意的地方?比如JDK ...
- Java并发-线程池篇-附场景分析
作者:汤圆 个人博客:javalover.cc 前言 前面我们在创建线程时,都是直接new Thread(): 这样短期来看是没有问题的,但是一旦业务量增长,线程数过多,就有可能导致内存异常OOM,C ...
- Java高并发与多线程(四)-----锁
今天,我们开始Java高并发与多线程的第四篇,锁. 之前的三篇,基本上都是在讲一些概念性和基础性的东西,东西有点零碎,但是像文科科目一样,记住就好了. 但是本篇是高并发里面真正的基石,需要大量的理解和 ...
- Java之创建线程的方式四:使用线程池
import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.c ...
- java架构《并发线程中级篇》
java多线程的三大设计模式 本章主要记录java常见的三大设计模式,Future.Master-Worker和生产者-消费者模式. 一.Future模式 使用场景:数据可以不及时返回,到下一次实际要 ...
随机推荐
- LVS之2---基于LVS负载均衡集群架构
LVS之2---基于LVS负载均衡集群架构实现 目录 LVS之2---基于LVS负载均衡集群架构实现 ipvsadm software package Options 常用命令 保存及重载规则 内存映 ...
- tabControl组件的吸顶效果
最开始,还没有使用better-scroll插件的时候,直接在class中设定了一定的position为sticky,设置一定的top达成了效果.但是,使用better-scroll组件后,这些属性就 ...
- ROS开源小车TurtleBot3详情介绍
您为什么要选择ROS开源智能小车 ROS(Robot Operating System,机器人操作系统)是目前世界上更主流更多人使用的的机器人开源操作系统.它可以提供操作系统应有的服务,包括硬件抽象, ...
- sql文件转换为excel文件
最近经常需要把sql整理成excel,本人比较懒,所以写一个小工具,用到了jxl包.以前没有接触过,正好了解一下. 一.基础知识 jxl操作excel包括对象 Workbook,Sheet ...
- Redis缓存篇(三)缓存污染
上一讲介绍了缓存满了,通过内存淘汰机制来淘汰掉数据.如果有的数据一直滞留在缓存中,但又没有应用使用,时间长了,就可能会占据大部分的缓存空间. 今天我们来学习一下缓存污染,以及如何解决缓存污染. 缓存污 ...
- linux下网络设置和远程连接
配置ip.子网掩码.静态设置.开机启动ONBOOT网卡 /etc/sysconfig/network-scripts/ifcfg-eth0 重启网络 service network restart ...
- 基于nginx实现web服务器的双机热备
1.适用场景 对于部署重要的服务,会使用两台服务器,互相备份,共同执行同一服务.当一台服务器出现故障时,可以由另一台服务器承担服务任务,从而在不需要人工干预的情况下,自动保证系统能持续提供服务.双机热 ...
- collection常用功能:
collection常用功能: Collection是所有单列集合的父接口,因此在collection中定义了单列集合(List)和(Set)通用的一些方法.这些方法可用于操作所有的单列集合,方法如下 ...
- 【JavaWeb】EL 表达式
EL 表达式 简介 EL(Expression Language),即表达式语言. EL 表达式主要是代替 jsp 页面中 表达式脚本 在 jsp 页面中进行数据的输出,因为 EL 表达式在输出数据的 ...
- Java 设置Excel条件格式(高亮条件值、应用单元格值/公式/数据条等类型)
概述 在Excel中,应用条件格式功能可以在很大程度上改进表格的设计和可读性,用户可以指定单个或者多个单元格区域应用一种或者多种条件格式.本篇文章,将通过Java程序示例介绍条件格式的设置方法,设置条 ...