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

JDK1.5 线程池 - ThreadPoolExecutor创建线程池

    博客分类:
  • Java
阅读更多
线程池简介见前面一篇,这边介绍下使用 ThreadPoolExecutor 创建线程池用法:

import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPoolExecutorTest {

	private static int queueDeep = 4;

	public void createThreadPool() {

		/*
		 * 创建线程池,最小线程数为2,最大线程数为4,线程池维护线程的空闲时间为3秒,
		 * 使用队列深度为4的有界队列,如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,
		 * 然后重试执行程序(如果再次失败,则重复此过程),里面已经根据队列深度对任务加载进行了控制。
		 */
		ThreadPoolExecutor tpe = new ThreadPoolExecutor(2, 4, 3,
				TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(queueDeep),
				new ThreadPoolExecutor.DiscardOldestPolicy());

		// 向线程池中添加 10 个任务
		for (int i = 0; i < 10; i++) {
			try {
				Thread.sleep(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			while (getQueueSize(tpe.getQueue()) >= queueDeep) {
				System.out.println("队列已满,等3秒再添加任务");
				try {
					Thread.sleep(3000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			TaskThreadPool ttp = new TaskThreadPool(i);
			System.out.println("put i:" + i);
			tpe.execute(ttp);
		}

		tpe.shutdown();
	}

	private synchronized int getQueueSize(Queue queue) {
		return queue.size();
	}

	public static void main(String[] args) {
		ThreadPoolExecutorTest test = new ThreadPoolExecutorTest();
		test.createThreadPool();
	}

	class TaskThreadPool implements Runnable {
		private int index;

		public TaskThreadPool(int index) {
			this.index = index;
		}

		public void run() {
			System.out.println(Thread.currentThread() + " index:" + index);
			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}



运行结果:
put i:0
Thread[pool-1-thread-1,5,main] index:0
put i:1
Thread[pool-1-thread-2,5,main] index:1
put i:2
put i:3
put i:4
put i:5
队列已满,等3秒再添加任务
Thread[pool-1-thread-1,5,main] index:2
Thread[pool-1-thread-2,5,main] index:3
put i:6
put i:7
队列已满,等3秒再添加任务
Thread[pool-1-thread-1,5,main] index:4
Thread[pool-1-thread-2,5,main] index:5
put i:8
put i:9
Thread[pool-1-thread-1,5,main] index:6
Thread[pool-1-thread-2,5,main] index:7
Thread[pool-1-thread-1,5,main] index:8
Thread[pool-1-thread-2,5,main] index:9


这里使用的有界队列,有助于防止资源耗尽,队列大小和最大池大小可能需要相互折衷:使用大型队列和小型池可以最大限度地降低 CPU 使用率、操作系统资源和上下文切换开销,但是可能导致人工降低吞吐量。如果任务频繁阻塞(例如,如果它们是 I/O 边界),则系统可能为超过您许可的更多线程安排时间。使用小型队列通常要求较大的池大小,CPU 使用率较高,但是可能遇到不可接受的调度开销,这样也会降低吞吐量。
分享到:
评论

相关推荐

    JDK1.5线程池源码及详细注释

    JDK 1.5引入了java.util.concurrent包,其中包含了线程池的实现,使得并发编程更加便捷和高效。线程池的核心在于它的设计策略,包括核心线程数、最大线程数、线程存活时间、工作队列以及拒绝策略。 线程池的主要类...

    JDK自带线程池分析

    创建线程池有多种方法,例如使用 Executors 工厂类或直接使用 ThreadPoolExecutor 类。下面是使用 Executors 工厂类创建线程池的示例代码: ```java import java.util.concurrent.ExecutorService; import java....

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

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

    线程-线程池-锁-集合-Map-队列.docx

    在Java中,使用`ExecutorService`和`ThreadPoolExecutor`来创建线程池,而不是直接使用`Executors`,因为`Executors`创建的线程池可能会导致资源耗尽的问题。 集合是Java中存储数据的主要工具,包括List、Set和Map...

    jdk1.5 线程并发与线程池的使用

    在Java编程语言中,线程并发和线程池是多任务执行的核心概念,尤其是在JDK 1.5及以后的版本中得到了显著增强。线程并发允许程序同时执行多个任务,提高了程序的效率和响应性。线程池是管理线程资源的有效方式,通过...

    jdk自带线程池实例详解

    jdk自带的线程池可以通过Executors工厂类来创建,Executors工厂类提供了多种创建线程池的方法,下面我们来看下使用示例: 1. newFixedThreadPool(固定大小的线程池) 使用newFixedThreadPool方法可以创建一个固定...

    自定义实现Java线程池1-模拟jdk线程池执行流程1

    本篇将探讨如何模拟Java的JDK线程池执行流程,以理解其设计原理。核心知识点包括线程池的执行策略、接口设计以及异常处理。 首先,Java中的线程池设计始于JDK 5.0,主要通过`java.util.concurrent`包中的`Executor`...

    java线程池ThreadPoolExecutor类使用详解.docx

    而线程池不允许使用Executors去创建,而要通过ThreadPoolExecutor方式,这一方面是由于jdk中Executor框架虽然提供了如newFixedThreadPool()、newSingleThreadExecutor()、newCachedThreadPool()等创建线程池的方法,...

    Java多线程应用

    Java中的`ExecutorService`接口和`ThreadPoolExecutor`类提供了线程池的实现。 - **工作队列** 是线程池内部管理任务的结构,例如`BlockingQueue&lt;Runnable&gt;`,用于存储待处理的任务,线程从队列中取出任务并执行。 ...

    JDK线程池和Spring线程池的使用实例解析

    JDK线程池可以通过ThreadPoolExecutor类来创建,ThreadPoolExecutor类提供了一个ExecutorService接口的实现。 在使用JDK线程池时,我们可以通过ThreadPoolExecutor类来创建一个线程池,例如: ```java private ...

    backport-util-concurrent(2.2 /3.1)

    - 在Java 5之前,Java标准库并没有提供如ThreadPoolExecutor这样的高级线程池实现。backport-util-concurrent提供了ThreadPool,它是Java 5 ThreadPoolExecutor的一个简化版本,用于管理和调度线程,有效地控制并发...

    JDK之ThreadPoolExecutor源码分析1

    《JDK之ThreadPoolExecutor源码分析1》 在Java编程中,线程池是一种高效的管理线程的方式,它通过复用已存在的线程来避免频繁创建和销毁线程带来的开销。ThreadPoolExecutor作为Java中的线程池实现,其内部机制相当...

    Java-jdk10-最新最全多线程编程实战指南-核心篇

    7. **线程池**:深入理解线程池的工作原理,如何自定义线程池,以及如何合理设置线程池参数以优化性能。 8. **Java内存模型**:探讨Java内存模型(JMM)如何保证多线程环境下的可见性和有序性,理解happens-before...

    Java线程池使用说明

    3. ThreadPoolExecutor:是ExecutorService的一个重要实现,提供了创建线程池的核心功能,包括线程池的维护、任务队列的管理等。 4. ScheduledExecutorService:继承自ExecutorService,用于处理需要定时或周期性...

    JavaCommon:Java基础用法,集合,线程,JUC,jdk5--8各个版本特性。

    - **线程池**:ExecutorService和ThreadPoolExecutor,管理线程资源,提高性能。 - **Future和Callable**:异步计算结果的获取。 5. **JDK 5到JDK 8的新特性**: - **JDK 5**:泛型、枚举、自动装箱/拆箱、可变...

    Java线程池文档

    在实际应用中,通常使用`Executors`工厂类来创建线程池,如`newFixedThreadPool`创建固定大小的线程池,`newCachedThreadPool`创建可缓存的线程池等。然而,对于大规模并发场景,建议直接实例化`ThreadPoolExecutor`...

    java线程池的使用方式

    然而,自JDK 1.5开始,随着`java.util.concurrent`包的引入,Java线程池的功能得到了极大的增强,为开发者提供了更加高效且易于管理的线程管理方式。 #### 二、线程池的作用与必要性 线程池的主要功能在于限制系统...

    Java线程池学习资料-全

    Java线程池是一种高效管理并发任务的工具,它通过复用线程来减少创建和销毁线程的开销,从而提高系统性能。线程池的核心组成部分包括工作队列(Work Queue)、工作线程(Worker Threads)和任务调度器(Executor)。...

    java socket线程池

    从JDK 1.5开始,Java并发API得到了增强,提供了更为强大的并发工具和库,其中就包括线程池的实现。线程池的主要优势在于可以重用线程,减少线程创建和销毁带来的开销,同时还可以有效控制并发数和管理资源。 在给出...

    java-jdk-1.8版本API离线文档(中文版)-海纳百川提供

    3. 线程池:ExecutorService和ThreadPoolExecutor的使用,提高系统资源利用率。 五、反射 1. Class类:如何获取类的信息,动态创建对象,以及调用方法和字段。 2. 构造器、方法和字段的反射:如何在运行时动态调用...

Global site tag (gtag.js) - Google Analytics