ThreadPoolExecutor 线程池
来源:互联网 发布:unity3d 透明shader 编辑:程序博客网 时间:2024/06/05 19:08
ThreadPoolExecutor 线程池:用于并发编程,当有多个线程任务需要执行时
如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,线程池能够使得线程可重复利用,执行完任务后线程不会立即被销毁而是继续执行其他的任务
- 构造方法
/*** 构造方法一**/ public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime, long TimeUnit unit, BlockingQueue<Runnable> workQueue) {} //int corePoolSize, 核心线程数量() //int maximumPoolSize,最大线程数量(核心线程数量+临时线程数量) //long keepAliveTime,线程完成任务当前没有任务时的闲置时间,若超过闲置时间还是没有任务,该线程将被销毁 //long TimeUnit unit, 等待时间单位(可以是TimeUnit.DAYS天,HOURS,MINUTES,SECONDS,MILLISECONDS等 //BlockingQueue<Runnable> workQueue 阻塞队列(任务缓存队列),用来储存等待执行的任务有三种 // ArrayBlockingQueue:基于数组的先进先出原则,创建时必须只能队列的大小 // LinkedBlockingQueue:基于链表的先进先出原则,创建时可指定大小,默认大小为Integer.MAX_VALUE; // SynchronousQueue:它不会缓存提交的任务,而是将直接新建一个线程来执行新来的任务,数据是在配对的生产者和消费者线程之间直接传递的,并不会将数据缓冲数据到队列中。/*** 构造方法二**/ public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime, long TimeUnit unit,BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) {} //threadFactory 线程工厂,主要用来创建线程/*** 构造方法三**/public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime, long TimeUnit unit,BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) {} //handler表示当拒绝处理任务时的策略,有四种取值 // ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出 // RejectedExecutionException异常。 // ThreadPoolExecutor.DiscardPolicy:丢弃任务,但不抛出异常。 // ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然 // 后重新尝试执行任务(重复此过程) // ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务 /*** 构造方法四**/ public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime, long TimeUnit unit,BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) {}
- ThreadPoolExecutor 常使用的方法
threadPoolExecutor.execute(runnable);//向threadPoolExecutor提交任务,runnable为实现了runnable接口的任务;threadPoolExecutor.submit(runnable);//向threadPoolExecutor提交任务,并返回任务执行的结果;threadPoolExecutor.shutdown();//线程池处于SHUTDOWN状态,threadPoolExecutor中已经提交的任务会继续被执行完,但是threadPoolExecutor不会再接受新提交任务threadPoolExecutor.shutdownNow();//线程池处于STOP状态,此时线程池不能接受新的任务,并且会去尝试终止正在执行的任务,并返回缓存队列中等待被执行任务的集合,缓存队列会被清空 threadPoolExecutor.getQueue();//返回当前threadPoolExecutor的缓存任务队列,主要用于调试程序 threadPoolExecutor.getPoolSize();//当前threadPoolExecutor中线程数量(包括闲置的线程) threadPoolExecutor.getActiveCount();//当前threadPoolExecutor中正在执行任务的线程数量,数量是动态的 threadPoolExecutor.getCompletedTaskCount();//当前threadPoolExecutor中已经执行完毕的任务数量,数量是动态的
- ThreadPoolExecutor的运行状态
volatile int runState;//runState表示当前线程池状态,是一个可变线程可见的整数 有如下几种取值static final int RUNNING = 0;//ThreadPoolExecutor被创建时出入RUNNRING状态static final int SHUTDOWN = 1;//当调用shutdown()后,转为SHUNDOWN状态;static final int STOP = 2;//当调用shutdownNow()后,转为STOP状态;static final int TERMINATED = 3;//当线程处于SHUTDOWN或STOP状态后,所有线程被执行或销毁,缓存队列中没有任务时转为TERMINATED状态;
- ThreadPoolExecutor任务处理策略
//***刚开始创建ThreadPoolExecutor时,线程池中没有线程,只有提交任务后才会创建线程// 1.如果当前线程池中的线程数目小于corePoolSize,则每来一个任务,就会创建一个线程去执行这个任务;// 2.如果当前线程池中的线程数目>=corePoolSize,则每来一个任务,会尝试将其添加到任务缓存队列当中,若添加成// 功,则该任务会等待空闲线程将其取出去执行;若添加失败(一般来说是任务缓存队列已满),则会尝试创建新的临// 时线程去执行这个任务;// 3.如果当前线程池中的线程数目达到maximumPoolSize,则会采取任务拒绝策略进行处理;// 4.如果线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止,直// 至线程池中的线程数目不大于corePoolSize;如果允许为核心池中的线程设置存活时间,那么核心池中的线程空闲// 时间超过keepAliveTime,线程也会被终止。
- 创建线程池方法
/*** 方法一**/LinkedBlockingQueue workQueue = new LinkedBlockingQueue(10);ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 10, 500, TimeUnit.MILLISECONDS, workQueue);//可以通过上面四种ThreadPoolExecutor的构造函数来new出ThreadPoolExecutor;/*** 方法二 ,它们实际上也是调用了ThreadPoolExecutor,只不过参数都已配置好了。**/Executor threadPool = Executors.newFixedThreadPool(i);//创建固定容量大小的缓冲池,创建的线程池corePoolSize和maximumPoolSize值是相等的,它使用的LinkedBlockingQueue;Executor threadPool = Executors.newCachedThreadPool(); //创建一个缓冲池,缓冲池容量大小为Integer.MAX_VALUE,将corePoolSize设置为0,将maximumPoolSize设置为Integer.MAX_VALUE,使用的SynchronousQueue,也就是说来了任务就创建线程运行,当线程空闲超过60秒,就销毁线程。Executor threadPool = Executors.newSingleThreadExecutor(); //创建容量为1的缓冲池,将corePoolSize和maximumPoolSize都设置为1,也使用的LinkedBlockingQueue
0 0
- Java 线程池ThreadPoolExecutor
- 线程池 ThreadPoolExecutor
- Java 线程池ThreadPoolExecutor
- 线程池ThreadPoolExecutor
- 线程池ThreadPoolExecutor参数设置
- Java 线程池ThreadPoolExecutor
- ThreadPoolExecutor线程池
- JAVA线程池:ThreadPoolExecutor
- ThreadPoolExecutor 线程池
- JAVA线程池ThreadPoolExecutor
- JAVA线程池ThreadPoolExecutor
- ThreadPoolExecutor java 线程池
- Java 线程池ThreadPoolExecutor
- java 线程池ThreadPoolExecutor
- ThreadPoolExecutor线程池
- JAVA线程池ThreadPoolExecutor
- java线程池:ThreadPoolExecutor
- ThreadPoolExecutor 线程池 多线程
- 如何配置Tomcat环境变量
- 手写Ajax程序实现异步刷新求和
- linux下QtCreator无法输入中文的情况
- 大数据学习——Flume介绍与安装
- 说说用虚拟主机上线DEDE项目遇到的些问题
- ThreadPoolExecutor 线程池
- java中正则表达式常用的构造元素
- vmwar网络配置
- ubuntu 16.04 把网卡名称改为wlan0和eth0
- CSS3的属性为什么要带前缀
- Oracle MySQL 5.5和5.6正受到Riddle漏洞影响,请立即更新到5.7!丨附下载
- 用ifconfig命令,只有lo,没有eth0的解决方案
- CSS3 实现文字流光渐变动画
- 为 Unity 开发者准备的虚幻引擎 4