Java 线程池ThreadPoolExecutor简单应用

什么是线程池:

线程池就是控制线程的一个池子。用来控制线程数量。

为什么要使用线程池:

1.避免系统重复创建和销毁线程影响运行的时间(创建+销毁>>执行时间时)

2.控制线程数量,线程过多会导致机器运行卡(大约一个线程占用1M空间)

ThreadPoolExecutor构造方法

public ThreadPoolExecutor(int corePoolSize,  int maximumPoolSize, long keepAliveTime, TimeUnit unit,  BlockingQueue<Runnable> workQueue)

参数1:核心线程池大小(标准大小)

参数2:线程池最大大小

参数3:设置多长时间超时回收线程

参数4:是一个枚举,表示 keepAliveTime 的单位

参数5:存放任务的队列

实例

public class ThreadPoolExecutorDemo {

	public static void main(String[] args) {
		//LinkedBlockingDeque线程队列大小无限制,不会抛异常
		BlockingQueue<Runnable> queue  = new LinkedBlockingDeque<Runnable>();
		//如果核心线程和最大线程相同,那么该线程是固定大小线程池。
		ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 6, 1, TimeUnit.DAYS, queue);
		for(int i=0;i<20;i++){
			executor.execute(new Runnable() {

				@Override
				public void run() {
					try {Thread.sleep(5000);} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName());
				}
			});
		}
		System.out.println("-----------------------------------------------");
		for(int i=0;i<20;i++){
			executor.submit(new Runnable() {

				@Override
				public void run() {
					System.out.println(Thread.currentThread().getName());
				}
			});
		}
		executor.shutdown();
	}

}

线程池在执行线程时会做出如下判断:

1.如果线程数小于核心线程,那么创建并执行这个县城

2.如果线程数大于核心线程则放入队列中

3.如果这时队列满了,并且小于最大线程数,那么创建执行这个线程

4.如果队列满了,并且大于最大线程数,那么抛异常。

当线程闲来无事时,超过了回收时间,并且线程池数量大于核心数量,那么就回收,直到回到核心线程数量

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-29 10:26:12

Java 线程池ThreadPoolExecutor简单应用的相关文章

Java线程池ThreadPoolExecutor使用和分析(三) - 终止线程池原理

相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池ThreadPoolExecutor使用和分析(三) - 终止线程池原理 以下是本文的目录大纲: 一.shutdown()  --  温柔的终止线程池 interruptIdleWorkers()  --  中断空闲worker tryTerminate()  --  尝试终止线程池 二.shutdown

JAVA线程池ThreadPoolExecutor与阻塞队列BlockingQueue .

从Java5开始,Java提供了自己的线程池.每次只执行指定数量的线程,java.util.concurrent.ThreadPoolExecutor 就是这样的线程池.以下是我的学习过程. 首先是构造函数签名如下: [java] view plain copy print ? public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<

java 线程池 ---- ThreadPoolExecutor 类

执行流程 1, 创建线程池后, 默认不会创建线程, 等到有任务带来才创建线程, 即一个线程处理一个任务 2, 当线程数量达到核心线程数时, 任务放进队列, 如果放入队列失败, 创建新线程处理任务(此时线程池线程数大于核心线程数) 3, 如果线程数大于最大线程数, 执行拒绝策略处理任务 构造方法 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, Block

Java线程池--ThreadPoolExecutor

一.线程池的处理流程 向线程池提交一个任务后,它的主要处理流程如下图所示: 一个线程从被提交(submit)到执行共经历以下流程: 线程池判断核心线程池里的线程是否都在执行任务,如果不是,则创建一个新的工作线程来执行任务.如果核心线程池里的线程都在执行任务,则进入下一个流程; 线程池判断工作队列是否已满.如果工作队列没有满,则将新提交的任务储存在这个工作队列里.如果工作队列满了,则进入下一个流程; 线程池判断其内部线程是否都处于工作状态.如果没有,则创建一个新的工作线程来执行任务.如果已满了,则

java线程池ThreadPoolExecutor理解

Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待.newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行.newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有

java 线程池ThreadPoolExecutor 如何与 AsyncTask() 组合使用。

转载请声明出处谢谢!http://www.cnblogs.com/linguanh/ 这里主要使用Executors中的4种静态创建线程池实例方法中的 newFixedThreadPool()来举例讲解. 简单说下Executors类,提供的一系列创建线程池的方法: 他们都有两个构造方法 1. --------newFixedThreadPool (创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待.) public static ExecutorService newFixed

深入理解java线程池—ThreadPoolExecutor

几句闲扯:首先,我想说java的线程池真的是很绕,以前一直都感觉新建几个线程一直不退出到底是怎么实现的,也就有了后来学习ThreadPoolExecutor源码.学习源码的过程中,最恶心的其实就是几种状态的转换了,这也是ThreadPoolExecutor的核心.花了将近小一周才大致的弄明白ThreadPoolExecutor的机制,遂记录下来. 线程池有多重要##### 线程是一个程序员一定会涉及到的一个概念,但是线程的创建和切换都是代价比较大的.所以,我们有没有一个好的方案能做到线程的复用呢

Java线程池ThreadPoolExecutor

线程池的好处 1. 降低资源的消耗 通过重复利用已创建的线程降低线程创建和销毁所造成的消耗 2. 提高响应速度 当任务到达时,任务可以不需要等到线程创建就能立即执行 3. 提高线程的可管理型 线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配.调优和监控. 实现原理 当提交一个新任务到线程池时,线程池的处理流程为: 1). 线程池判断核心线程池里的线程是否都在执行任务. 如果不是,则创建一个新的工作线程来执行任务.如果核心线程池里的线程都在执行

Android Java 线程池 ThreadPoolExecutor源代码篇

线程池简单点就是任务队列+线程组成的. 接下来我们来简单的了解下ThreadPoolExecutor的源代码. 先看ThreadPoolExecutor的简单类图,对ThreadPoolExecutor总体来个简单的认识. 为了分析ThreadPoolExecutor我们得下扯点队列和队列里面的任务这东西. 常见三种BlockingQueue堵塞队列SynchronousQueue,LinkedBlockingQueue,ArrayBlockingQueue当然还有其它的,简单类图(仅仅画了Sy