`
sinye
  • 浏览: 218983 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java.util.concurrent.Executor理解

 
阅读更多

    相信搞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,运行结果见图:



 多了一个任务线程,则抛出了异常。

 

  • 大小: 8.9 KB
  • 大小: 13.7 KB
  • 大小: 17.7 KB
分享到:
评论

相关推荐

    java.util.concurrent 学习ppt

    Java.util.concurrent是Java 5.0引入的一个重要包,它为多线程编程提供了一组高级并发工具。这个包的设计者是Doug Lea,它的出现是JSR-166的一部分,也被称作Tiger更新。Java.util.concurrent的引入是为了解决传统...

    java.util.concurrent

    java.util.concurrent总体概览图。 收取资源分3分。...java.util.concurrent主要包括5个部分executor,colletions,locks,atomic,tools。 该图详细的列举了并发包下面的结构,包含所有接口和具体实现类。

    JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用

    "JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用" JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用是Java多线程编程中的一种重要概念。随着多线程编程的普及,线程池的使用变得...

    java.util.concurrent.uml.pdf

    标题中提到了“java.util.concurrent.uml.pdf”,这表明文件是一份Java并发编程工具包java.util.concurrent的UML(统一建模语言)类结构图的PDF格式文件。UML图能够帮助开发者理解Java并发包中的类、接口及其关系,...

    java.util.concurrent 实现线程池队列

    `java.util.concurrent` 包(简称JUC)是Java提供的一个强大的并发工具包,它提供了丰富的并发组件,如线程池、并发容器、锁和同步机制等,极大地简化了并发编程的复杂性。本篇文章将深入探讨如何使用`java.util....

    java_util_concurrent中文版pdf

    综上所述,《Java Util Concurrent中文版》详尽解读了这些关键概念和工具,帮助开发者深入理解Java并发编程,提升程序的并发性能和稳定性。通过学习这本书,开发者可以更好地应对多线程环境下的挑战,写出更加高效、...

    java.util.concurrent 测试源文件

    Java.util.concurrent(JUC)是Java平台中的一个核心包,专门用于处理多线程并发问题。这个包包含了大量的工具类和接口,极大地简化了并发编程的复杂性,提高了程序的性能和可伸缩性。本测试源文件主要是针对JUC并发...

    浅谈java.util.concurrent包中的线程池和消息队列

    java.util.concurrent.Executors提供了一个java.util.concurrent.Executor接口的实现用于创建线程池。线程池技术主要解决处理器单元内多个线程执行的问题,可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐...

    java在服务启动的时候启动定时器

    在Java中,我们可以使用多种库来实现这个功能,其中最常用的两个是`java.util.Timer`和`java.util.concurrent.ScheduledExecutorService`。 ## 1. `java.util.Timer` `Timer`类是Java标准库中的一个基础定时器,...

    java定时执行方法&节拍器

    总结一下,Java中实现定时任务主要依靠`java.util.Timer`、`java.util.concurrent.ScheduledExecutorService`等原生API,以及一些第三方库如Quartz。在实际开发中,选择合适的定时任务解决方案需要考虑项目的复杂性...

    tascalate-concurrent:阻塞(IO绑定)的实现可取消java.util.concurrent.CompletionStage和java.util.concurrent.ExecutorService-s的相关扩展

    此功能增强了唯一的Java 8内置实现 ,该实现主要支持计算任务。 此外,该库还可以帮助解决许多异步编程难题,例如处理超时,重试/轮询功能,协调多个并发计算的结果等。 从版本该库以多发行版JAR的形式提供,并且...

    java中的定时器,定时访问某程序等

    Java提供了多种实现定时任务的方式,其中最常用的包括`java.util.Timer`类和`java.util.concurrent.ScheduledExecutorService`接口。本篇文章将深入探讨这两种方法以及它们在实际应用中的使用。 首先,我们来看`...

    java定时关机源码

    在Java中,我们可以利用各种库和API来创建这样的程序,其中最常用的是Java的定时任务处理工具,如`java.util.Timer`和`java.util.concurrent.ScheduledExecutorService`。 首先,我们来探讨`java.util.Timer`类。这...

    java定时执行代码.

    Java提供了多种实现定时任务的机制,这里主要介绍两种:Java.util.Timer类和java.util.concurrent.ScheduledExecutorService接口。 1. Java.util.Timer类: Timer类是Java早期提供的定时任务工具,它可以安排在...

    Java计时器

    其次,`java.util.concurrent.ScheduledExecutorService` 是Java并发包(java.util.concurrent)中的接口,它提供了更强大和灵活的定时任务调度功能。我们可以使用`Executors`类的静态方法创建一个...

    JAVA课程学习笔记.doc

    - `java.util.concurrent.Executor`:这是最基本的执行器接口,只有一个 `execute(Runnable task)` 方法,用于提交任务。 - `java.util.concurrent.ExecutorService`:扩展了 `Executor`,提供了管理执行器生命周期...

    Java实现生产者消费者模型

    Java实现生产者消费者模型 生产者消费者模型,是一般面试题都会考的,下面介绍使用ReetrantLock实现 生产者消费者模型。 定义一个ReentrantLock锁,同时new出两个condition,一...import java.util.concurrent.Executor

    Java定时执行某个任务

    这里我们将深入探讨两种主要的方法:Java的`java.util.Timer`类和Java 5及以上版本引入的`java.util.concurrent.ScheduledExecutorService`接口。 首先,我们来了解`java.util.Timer`类。这个类允许开发者创建一个...

    java 实现调度器

    这通常是通过Java中的`java.util.Timer`类或者`java.util.concurrent.ScheduledExecutorService`来实现的。这两个工具提供了不同的功能和使用场景,让我们一一进行深入探讨。 首先,我们来看`java.util.Timer`类。...

Global site tag (gtag.js) - Google Analytics