相信搞java的都接触过java.util.concurrent.Executor,它的子类为ThreadPoolExecutor,在多线程方面这个接口能方便的构建一个线程池,调用此接口子类下的execute(Thread thread)便能将一个线程任务添加到此线程池中,由它统一管理你的线程调度及执行
首先理解下它的几个重要参数:
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory)
corePoolSize:核心工作线程数
maximumPoolSize:最大工作线程数
keepAliveTime:线程池维护线程所允许的空闲时间
unit:线程池维护线程所允许的空闲时间的单位
workQueue:线程等待队列
threadFactory:构造线程的Factory
在这里要区分一下工作线程和任务线程,任务线程是我们实现Runnable接口或者继承Thread的来满足我们任务的线程,比如一个从网络下载图片的线程。工作线程则是ThreadPoolExecutor用于调度及管理来执行任务线程的线程。理解了这点后,我们来看一下ThreadPoolExecutor是如何创建和管理工作线程的。
(1)任务线程数<corePoolSize,则新创建一个工作线程去执行线程任务。
(2)corePoolSize+workQueue的大小>任务线程数>corePoolSize,将任务线程天骄等待队列workQueue中,此时不创建新的工作线程。
(3)maximumPoolSize+workQueue<任务线程数>corePoolSize+workQueue的大小,创建新的工作线程,直到产生maximumPoolSize+workQueue个工作线程。
(4)任务线程数>maximumPoolSize+workQueue,抛出RejectedExecutionException异常。
下面我们以一段代码来验证,先看任务线程,自己定义的一个MyTask类,代码如下:
public class MyTask implements Runnable{ private int count = 0; public MyTask(int count){ this.count = count; } public MyTask(){ } @Override public void run() { // TODO Auto-generated method stub try { Thread.sleep(1000);//模拟线程执行时间 System.out.println("--count="+count+" is excute & current thread name="+Thread.currentThread().getName()); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
接着构造一个ThreadPoolExecutor,代码如下
public class Test { private static int CORE_POOL_SIZE = 3; private static int MAXIMUM_POOL_SIZE = 128; private static final int KEEP_ALIVE = 1; private static final ThreadFactory sThreadFactory = new ThreadFactory() { private final AtomicInteger mCount = new AtomicInteger(1); public Thread newThread(Runnable r) { return new Thread(r, "AsyncTask #" + mCount.getAndIncrement()); } }; private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>( 10); public static final Executor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor( CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory); public static void main(String[] args) { for (int i = 0; i < 13; i++) { try { THREAD_POOL_EXECUTOR.execute(new MyTask(i)); } catch (Exception e) { e.printStackTrace(); } } } }
在这里创建了一个核心工作线程(CORE_POOL_SIZE)为3,等带队列(sPoolWorkQueue)为10,最大工作线程(MAXIMUM_POOL_SIZE)为128的ThreadPoolExecutor,然后任务线程数为13个,刚好满足上述条件(2),那么将不会创建核心工作线程,执行结果见图
然后我们将i=13改成大于13且小于128+10=138的数字,此时条件满足上述(3)情形,我改为i<20,运行结果见图:
我们看到核心工作线程增加了7个,由原来的3个增加到10个,刚好等待队列+核心工作线程为13,我的任务线程数为20,所以重新创建了7个工作线程。
接着我们把i设置成大于138的值,这是条件满足(4),我这里设置为i<139,运行结果见图:
多了一个任务线程,则抛出了异常。
相关推荐
Java.util.concurrent是Java 5.0引入的一个重要包,它为多线程编程提供了一组高级并发工具。这个包的设计者是Doug Lea,它的出现是JSR-166的一部分,也被称作Tiger更新。Java.util.concurrent的引入是为了解决传统...
java.util.concurrent总体概览图。 收取资源分3分。...java.util.concurrent主要包括5个部分executor,colletions,locks,atomic,tools。 该图详细的列举了并发包下面的结构,包含所有接口和具体实现类。
Java.util.concurrent(JUC)是Java平台中的一个核心包,专门用于处理多线程并发问题。这个包包含了大量的工具类和接口,极大地简化了并发编程的复杂性,提高了程序的性能和可伸缩性。本测试源文件主要是针对JUC并发...
"JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用" JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用是Java多线程编程中的一种重要概念。随着多线程编程的普及,线程池的使用变得...
标题中提到了“java.util.concurrent.uml.pdf”,这表明文件是一份Java并发编程工具包java.util.concurrent的UML(统一建模语言)类结构图的PDF格式文件。UML图能够帮助开发者理解Java并发包中的类、接口及其关系,...
`java.util.concurrent` 包(简称JUC)是Java提供的一个强大的并发工具包,它提供了丰富的并发组件,如线程池、并发容器、锁和同步机制等,极大地简化了并发编程的复杂性。本篇文章将深入探讨如何使用`java.util....
综上所述,《Java Util Concurrent中文版》详尽解读了这些关键概念和工具,帮助开发者深入理解Java并发编程,提升程序的并发性能和稳定性。通过学习这本书,开发者可以更好地应对多线程环境下的挑战,写出更加高效、...
java.util.concurrent.Executors提供了一个java.util.concurrent.Executor接口的实现用于创建线程池。线程池技术主要解决处理器单元内多个线程执行的问题,可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐...
在Java中,我们可以使用多种库来实现这个功能,其中最常用的两个是`java.util.Timer`和`java.util.concurrent.ScheduledExecutorService`。 ## 1. `java.util.Timer` `Timer`类是Java标准库中的一个基础定时器,...
总结一下,Java中实现定时任务主要依靠`java.util.Timer`、`java.util.concurrent.ScheduledExecutorService`等原生API,以及一些第三方库如Quartz。在实际开发中,选择合适的定时任务解决方案需要考虑项目的复杂性...
此功能增强了唯一的Java 8内置实现 ,该实现主要支持计算任务。 此外,该库还可以帮助解决许多异步编程难题,例如处理超时,重试/轮询功能,协调多个并发计算的结果等。 从版本该库以多发行版JAR的形式提供,并且...
Java提供了多种实现定时任务的方式,其中最常用的包括`java.util.Timer`类和`java.util.concurrent.ScheduledExecutorService`接口。本篇文章将深入探讨这两种方法以及它们在实际应用中的使用。 首先,我们来看`...
在Java中,我们可以利用各种库和API来创建这样的程序,其中最常用的是Java的定时任务处理工具,如`java.util.Timer`和`java.util.concurrent.ScheduledExecutorService`。 首先,我们来探讨`java.util.Timer`类。这...
Java提供了多种实现定时任务的机制,这里主要介绍两种:Java.util.Timer类和java.util.concurrent.ScheduledExecutorService接口。 1. Java.util.Timer类: Timer类是Java早期提供的定时任务工具,它可以安排在...
其次,`java.util.concurrent.ScheduledExecutorService` 是Java并发包(java.util.concurrent)中的接口,它提供了更强大和灵活的定时任务调度功能。我们可以使用`Executors`类的静态方法创建一个...
- `java.util.concurrent.Executor`:这是最基本的执行器接口,只有一个 `execute(Runnable task)` 方法,用于提交任务。 - `java.util.concurrent.ExecutorService`:扩展了 `Executor`,提供了管理执行器生命周期...
Java实现生产者消费者模型 生产者消费者模型,是一般面试题都会考的,下面介绍使用ReetrantLock实现 生产者消费者模型。 定义一个ReentrantLock锁,同时new出两个condition,一...import java.util.concurrent.Executor
这里我们将深入探讨两种主要的方法:Java的`java.util.Timer`类和Java 5及以上版本引入的`java.util.concurrent.ScheduledExecutorService`接口。 首先,我们来了解`java.util.Timer`类。这个类允许开发者创建一个...
这通常是通过Java中的`java.util.Timer`类或者`java.util.concurrent.ScheduledExecutorService`来实现的。这两个工具提供了不同的功能和使用场景,让我们一一进行深入探讨。 首先,我们来看`java.util.Timer`类。...