本章主要记录讲解并发线程的线程池。使用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架构《并发线程高级篇二》的更多相关文章

  1. java架构《并发线程高级篇四》

    本章主要讲并发线程的常见的两种锁.重入锁和读写锁 一:重入锁(ReentrantLock) 概念:重入锁,在需要进行同步的代码加锁,但最后一定不要忘记释放锁,否则会造成锁永远不能释放,其他线程进不了 ...

  2. java架构《并发线程高级篇一》

    本章主要记录讲解并发线程的线程池.java.util.concurrent工具包里面的工具类. 一:Executor框架: Executors创建线程池的方法: newFixedThreadPool( ...

  3. java架构《并发线程高级篇三》

    本章主要介绍和讲解concurrent.util里面的常用的工具类. 一.CountDownLatch使用:(用于阻塞主线程) 应用场景 :通知线程休眠和运行的工具类,是wait和notify的升级版 ...

  4. Java高并发 -- 线程池

    Java高并发 -- 线程池 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 在使用线程池后,创建线程变成了从线程池里获得空闲线程,关闭线程变成了将线程归坏给线程池. ...

  5. Java高并发--线程安全策略

    Java高并发--线程安全策略 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 不可变对象 发布不可变对象可保证线程安全. 实现不可变对象有哪些要注意的地方?比如JDK ...

  6. Java并发-线程池篇-附场景分析

    作者:汤圆 个人博客:javalover.cc 前言 前面我们在创建线程时,都是直接new Thread(): 这样短期来看是没有问题的,但是一旦业务量增长,线程数过多,就有可能导致内存异常OOM,C ...

  7. Java高并发与多线程(四)-----锁

    今天,我们开始Java高并发与多线程的第四篇,锁. 之前的三篇,基本上都是在讲一些概念性和基础性的东西,东西有点零碎,但是像文科科目一样,记住就好了. 但是本篇是高并发里面真正的基石,需要大量的理解和 ...

  8. Java之创建线程的方式四:使用线程池

    import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.c ...

  9. java架构《并发线程中级篇》

    java多线程的三大设计模式 本章主要记录java常见的三大设计模式,Future.Master-Worker和生产者-消费者模式. 一.Future模式 使用场景:数据可以不及时返回,到下一次实际要 ...

随机推荐

  1. jit编译原理

    jit用以把程序全部或部分翻译成本地机器码,当需要装载某个类[通常是创建第一个对象时],编译器会先找到其.class文件,然后将该类的字节码装入内存. hotspot采用惰性评估法: 如果一段代码频繁 ...

  2. C#自定义控件的应用(数据绑定,属性等)

    刚刚开始程序设计的码农生涯,也许一些开发工具上的控件可以满足我们的需求,但是随之时间的迁移,我们对控件的呈现形式需求越来越多样化,这个时候就需要我们来自定义控件,我是一个刚刚入职没多久的菜鸟,接触软件 ...

  3. Beta冲刺——第九天

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE1 这个作业要求在哪里 https://edu.cnblogs.com/campus/fz ...

  4. Ubuntu/Liinux睡眠无法唤醒解决方法:ACPI设置

    最近给笔记本换了一个固态,顺便就重装了一下系统,版本是Ubuntu 20.10.装完之后各种功能基本都是正常的,触摸板轻触单击.双指右键等功能开箱即用.但是在安装完最新的Nvidia驱动之后就出现了问 ...

  5. netty之EventLoop源码分析

    我们在讲解服务端和客户端时经常会看到提交一个任务到channel对应的EventLoop上,后续的io事件监听和任务执行都在EventLoop完成,可以说EventLoop是netty最核心的组件,我 ...

  6. 计算机考研复试真题 abc

    题目描述 设a.b.c均是0到9之间的数字,abc.bcc是两个三位数,且有:abc+bcc=532.求满足条件的所有a.b.c的值. 输入描述: 题目没有任何输入. 输出描述: 请输出所有满足题目条 ...

  7. ES6 自定义一个实现了Iterator接口的对象

    参考资料 var obj = { data: [1,2,3,4,5], // 这里实际上就是去定义如何实现Iterator接口 [Symbol.iterator](){ const that = th ...

  8. 【译】Async/Await(二)——Futures

    原文标题:Async/Await 原文链接:https://os.phil-opp.com/async-await/#multitasking 公众号: Rust 碎碎念 翻译 by: Praying ...

  9. LeetCode653. 两数之和 IV - 输入 BST

    题目 直接暴力 1 class Solution { 2 public: 3 vector<int>ans; 4 bool findTarget(TreeNode* root, int k ...

  10. CTFshow-萌新赛逆向_签退

    查看题目信息 下载re3.pyc文件 使用uncompyle把re3.pyc反编译为re3.py uncompyle6 re3.pyc > re3.py 查看re3.py文件 # uncompy ...