`

线程池常用几种方式

阅读更多
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;


/**
 * 1,直接提交队列:SynchronousQueue队列,提交的任务不会被保存,总是会马上提交执行。
 * 2,有界任务队列:ArrayBlockingQueue,有任务对时候直接创建线程,如果thread 数量大于 corePoolSize,则将新的任务加入到等待队列ArrayBlockingQueue中(有初始化大小),如果等待队列已满,则继续创建线程,如果数量 大于 maximumPoolSize,则执行拒绝策略。
 * 3,无界的任务队列:LinkedBlockingQueue,线程池的任务可以无限制的添加新的任务,而线程池创建对最大线程数量就是corePoolSize的数量,此处maximumPoolSize参数无效,超出corePoolSize数量的新任务都是进入任务队列。
 * 4,优先任务队列:PriorityBlockingQueue它其实是一个特殊的无界队列,线程池创建的线程数也不会超过corePoolSize的数量,只不过其他队列一般是按照先进先出的规则处理任务,而PriorityBlockingQueue队列可以自定义规则根据任务的优先级顺序先后执行
 * @Description: 
 * @author: zhangjianshou  
 * @date: 2019年9月9日 下午2:28:20
 */
public class ThreadPool1 {

    private static ThreadPoolExecutor pool;

    public static void main(String[] args) {
        /**
         * int corePoolSize, 指定了线程池中的线程数量,它的数量决定了添加的任务是开辟新的线程去执行,还是放到workQueue任务队列中去;
         * int maximumPoolSize, 指定了线程池中的最大线程数量,这个参数会根据你使用的workQueue任务队列的类型,决定线程池会开辟的最大线程数量;
         * long keepAliveTime, 当线程池中空闲线程数量超过corePoolSize时,多余的线程会在多长时间内被销毁;
         * TimeUnit unit, 
         * BlockingQueue<Runnable> workQueue, 任务队列,被添加到线程池中,但尚未被执行的任务;它一般分为直接提交队列、有界任务队列、无界任务队列、优先任务队列几种;
         * ThreadFactory threadFactory, 线程工厂,用于创建线程,一般用默认即可;
         * RejectedExecutionHandler handler, 拒绝策略;当任务太多来不及处理时,如何拒绝任务;
         */
        
        // maximumPoolSize设置为2 ,拒绝策略为AbortPolic策略,直接抛出异常
        /**
         * 第一种
         */
        //  pool = new ThreadPoolExecutor(1, 2, 1000, TimeUnit.MILLISECONDS, new SynchronousQueue<Runnable>(),
        //  Executors.defaultThreadFactory(), new MyRejectedExecutionHandler());
        /**
         * 第二种
         * ArrayBlockingQueue,初始容量5
         */
        pool = new ThreadPoolExecutor(1, 2, 1000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(5),
                Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
        
        /**
         * 第三种
         */
        //   pool = new ThreadPoolExecutor(1, 2, 1000, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(),
        //   Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
        for (int i = 0; i < 3; i++) {
            pool.execute(new ThreadTask());
        }
    }
}

class ThreadTask implements Runnable {
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
}

/**
 * @Description: 拒绝策略,直接调用当前调用者线程资源 来执行run方法
 * @author: zhangjianshou  
 * @date: 2019年9月9日 下午4:34:27
 */
class MyRejectedExecutionHandler implements RejectedExecutionHandler {

    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        // TODO Auto-generated method stub
       System.out.println("拒绝策略);
       r.run();
    }
}
分享到:
评论

相关推荐

    浅谈java常用的几种线程池比较

    下面小编就为大家带来一篇浅谈java常用的几种线程池比较。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    多线程服务器的几种常用模型

    线程池 epoll 总结了一两种常用的线程模型, 归纳了进程间通讯与线程同步的最佳实践,以期用简单规范的方式开发多线程程序。

    Android项目异步加载图像小结 (含线程池,缓存方法).rar

    3. 缓存方法:详细讲解了在Android项目中实现图像缓存的几种常用方法,包括内存缓存、磁盘缓存和第三方库缓存。这些缓存方法可以有效减少网络请求次数,降低服务器压力,提高图像加载速度。 4. 实践案例分析:通过...

    java面试题.docx

    企业常见java面试题,java基础,java进阶 JDK 和 JRE 有什么区别? == 和 equals 的区别是什么? 两个对象的 hashCode()相同,则...创建线程池有哪几种方式? 在 java 程序中怎么保证多线程的运行安全? 什么是死锁?

    携程评论爬虫,使用线程池来爬取热门景区评论,简单易用。一键爬取任意省的所有热门景区。.zip

    爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的...

    cardinals:Android常用工具类集合

    将某些常用功能和第三方库进行封装可以帮你进行快速功能特性提供MvpActivity、MvpFragment、MvpPresenter、MvpView等可以让你可以基于mvp快速...和Retrofit的封装封装几种常见的加密方式封装常用的线程池重用的工具类...

    史上最全java面试,103项重点知识,带目录

    44. 创建线程池有哪几种方式? 17 45. 线程池都有哪些状态? 18 46. 线程池中 submit()和 execute()方法有什么区别? 18 49. 什么是死锁? 19 50. 怎么防止死锁? 19 51. ThreadLocal 是什么?有哪些使用场景? 20 ...

    Java常见面试题208道.docx

    44.创建线程池有哪几种方式? 45.线程池都有哪些状态? 46.线程池中 submit()和 execute()方法有什么区别? 47.在 java 程序中怎么保证多线程的运行安全? 48.多线程锁的升级原理是什么? 49.什么是死锁? 50.怎么...

    线程基础知识-必知必会

    线程有哪几种状态?start() 和 run() 区别sleep() 和wait() 的区别blocked 状态和waiting 状态的区别线程的常用方法join() 和 yeild()创建线程有哪些方式?你平时是怎么写的?线程池的三个方法,七大参数,四种策略...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--缓存优化之几种方案lastModified |--缓存优化之本地缓存优化(超过规定值或SD卡容量不够时) |--网络post提交查询请求 |--网络之HttpClient的get和post用法 |--网络之判断网络状态是否可用 |--网络之设置apn |--...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【基础】Java 中定义常量的几种方法 25 【基础】什么时候使用字节流?什么时候用字符流? 26 【基础】GBK与UTF-8的区别 26 【基础】static、final、const的区别 26 final: 26 static: 27 【基础】如何实现对象克隆?...

    \java超强笔记(超级经典)

    值的类型是有限制的,只能是以下几种: 8种基本数据类型 String Class Enum Annotation 以及他们的数组 多值注释:每个值之间用逗号隔开 四种元注释:java.lang....

    javaSE代码实例

    3.10 常用数学工具包——java.lang.Math类 39 3.10.1 数学常量 39 3.10.2 常用数学函数 40 3.11 小结 41 第4章 流程控制——Java世界的航行舵手 42 4.1 if条件语句 42 4.1.1 简略形式 42 4.1.2 完全...

    java版飞机大战源码-java-club:Java程序员所需要掌握的核心知识都在这里。。。。alittledaily~

    收集几个参与社区投稿、开源项目的途径 博文收集(敖丙系列&芋道源码系列) 注 : 没链接的是还没写 Java基础核心串讲 计算机操作系统与Linux 7种常见的设计模式和使用场景 Java必会基础与新版本特性 集合框架 深入浅...

    ebsite for net4.0网站建设系统 v3.0 正式版.zip

    16.增加线程监视功能,为了提高性能,给用户一个更好的使用体验,ebsite将很多非即时任务(也就是不用即时反馈给用户的任务)交给线程池中来处理,你可以在后台查看当前处理的任务数,及设置任务的处理并发线程。...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例150 实例化Class类的5种方式 196 实例151 获得Class对象表示实体的名称 197 实例152 查看类的声明 198 实例153 查看类的成员 199 实例154 按继承层次对类排序 201 实例155 查看内部类信息 202 7.2 反射的进阶 ...

    vc++ 应用源码包_1

    CCAMS系统是一种用于局域网下的CS模式的软件管理和监测系统源码 它包括客户端和服务端,客户端软件主要作用是监测本主机的活动,并将监测到的信息定时发送给服务器。服务器可以将收集到的信息以柱状图和文件列表以及...

Global site tag (gtag.js) - Google Analytics