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

java 简单线程池ThreadPool

阅读更多
java线程池
线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。

线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为:

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
corePoolSize: 线程池维护线程的最少数量
maximumPoolSize:线程池维护线程的最大数量
keepAliveTime: 线程池维护线程所允许的空闲时间
unit: 线程池维护线程所允许的空闲时间的单位
workQueue: 线程池所使用的缓冲队列
handler: 线程池对拒绝任务的处理策略

一个任务通过 execute(Runnable)方法被添加到线程池,任务就是一个 Runnable类型的对象,任务的执行方法就是 Runnable类型对象的run()方法。

当一个任务通过execute(Runnable)方法欲添加到线程池时:

如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。
如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。
核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。

当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。

unit可选的参数为java.util.concurrent.TimeUnit中的几个静态属性:
NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS。

workQueue 常用的是:java.util.concurrent.ArrayBlockingQueue

handler有四个选择:
ThreadPoolExecutor.AbortPolicy()
抛出java.util.concurrent.RejectedExecutionException异常
ThreadPoolExecutor.CallerRunsPolicy()
重试添加当前的任务,他会自动重复调用execute()方法
ThreadPoolExecutor.DiscardOldestPolicy()
抛弃旧的任务
ThreadPoolExecutor.DiscardPolicy()
抛弃当前的任务

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import org.apache.log4j.Logger;



/**
 * 线程池
 * @author wangweijie
 * @version 1.0
 *
 */
public class ThreadPool extends ThreadPoolExecutor{
	private static Logger log = Logger.getLogger(ThreadPool.class);
	private static ThreadPool _instance = null;
	private static final int maximumPoolSize = 20;   //线程池维护线程的最大数量 
		
	private static final int corePoolSize = 10;		//线程池维护线程的最少数量 

	private final static long keepAliveTime = 3;// 3s 
	
	private final static TimeUnit timeUnit = TimeUnit.SECONDS;   //时间单位 秒
	
	@SuppressWarnings("unchecked")
	private static BlockingQueue workQueue;   //线程池所使用的缓冲队列 
	
	private static RejectedExecutionHandler handler;

    private static final int cacheQueueSize = 10000;    //缓存队列大小
    
    @SuppressWarnings("unchecked")
	private ThreadPool(int corePoolSize, int maximumPoolSize,
			long keepAliveTime, TimeUnit unit, BlockingQueue workQueue,
			 RejectedExecutionHandler handler){
    	super(corePoolSize, maximumPoolSize, keepAliveTime, timeUnit, workQueue, handler);
    }

    @SuppressWarnings("unchecked")
	public static synchronized ThreadPool getInstance(){
    	if(null == _instance){
        	log.info("线程池初始化.....缓存队列大小["+cacheQueueSize+"]线程池维护线程的最大数量 [" +maximumPoolSize + "]最少数量[ " + corePoolSize + "]" );
        	workQueue = new ArrayBlockingQueue(cacheQueueSize);    //缓冲队列
        	handler = new ThreadPoolExecutor.CallerRunsPolicy(); // 处理方式 重试添加当前的任务,他会自动重复调用execute()方法 
        	_instance = new ThreadPool(corePoolSize, maximumPoolSize, keepAliveTime, timeUnit, workQueue, handler);
    	}
    	return _instance;
    }
    
    /**
     *execute执行之后操作
     */

    @Override
	protected void afterExecute(Runnable r, Throwable t) {
    	
    	log.debug("线程["+r.hashCode()+"]执行完成,当前线程池中线程数为" + super.getPoolSize() + " 执行线程为" + super.getActiveCount() + " 缓存队列线程数" +workQueue.size());
		super.afterExecute(r, t);
	}
        
      /**
       *execute执行之前操作
       */

	@Override
	protected void beforeExecute(Thread t, Runnable r) {
    	log.debug("线程 ["+r.hashCode()+"]执行开始,当前线程池中线程数为" + super.getPoolSize() + " 执行线程为" + super.getActiveCount() + " 缓存队列线程数" +workQueue.size());
		super.beforeExecute(t, r);
	}	
	
}



用的时候只需要
Runnable xxx = new RunnableImpl();
ThreadPool.getInstance().execute(xxx);
分享到:
评论

相关推荐

    java线程池threadpool简单使用源码

    要理解`java线程池threadpool简单使用源码`,你需要查看`src`目录下的Java文件,了解如何实例化`ThreadPoolExecutor`,设置相关参数,以及如何提交任务到线程池。同时,查看源码中对`ThreadGroup`的使用,理解它如何...

    Java版线程池ThreadPool.zip

    Java线程池(ThreadPool)是Java并发编程中的一个重要概念,它是多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池可以有效控制运行的线程数量,如果线程数量超过了最大数量,...

    Java简单线程池 线程池中文文档

    简单的线程池程序+中文文档 包结构: com.tangkai.threadpool --SimpleThread.java 工作线程 --TestThreadPool.java 程序入口 --ThreadPoolManager.java 线程池管理类

    线程池threadpool_src

    通过分析和理解“线程池threadpool_src”的源代码,开发者可以学习如何自定义线程池,如何优化任务调度策略,以及如何在多线程环境下保证程序的稳定性和效率。同时,了解线程池的工作原理对于提升软件的并发处理能力...

    线程池ThreadPool

    线程池ThreadPool。

    完全解析Android多线程中线程池ThreadPool的原理和使用

    "Android多线程中线程池ThreadPool的原理和使用" Android多线程中线程池ThreadPool的原理和使用是Android开发中非常重要的知识点。线程池ThreadPool是指一个池子中包含多个线程的集合,用于管理和维护多个线程的...

    java自定义线程池应用

    ThreadPool 线程池类 DEFAULT_POOL_SIZE 默认线程池大小 threadPool 线程队列 taskQueue 任务队列 poolSize 自定义线程池大小 通过构造启动该线程池,调用addTask 方法将task任务传入,线程池会自动分配线程去执行...

    Java实现通用线程池

    Java 实现通用线程池 Java 实现通用线程池是指使用 Java 语言编写一个通用的线程池,线程池通俗的描述就是预先创建若干空闲线程,等到需要用多线程去处理事务的时候去唤醒某些空闲线程执行处理任务,这样就省去了...

    线程池 threadpool

    在其他编程语言和平台中,如Java的ExecutorService或C#的ThreadPool,也有类似的概念和实现。 在VC6.0这个经典的Visual C++开发环境中,虽然线程池不是内置的功能,但开发者可以通过自定义实现来创建和管理线程池。...

    Java8并行流中自定义线程池操作示例

    在这篇短文中,我们将看一下 Stream API的最大限制,同时看一下如何让并行流和线程池实例(ThreadPool instance)一起工作。 知识点:Java8引入了流的概念,流是作为一种对数据执行大量操作的有效方式。并行流可以被...

    创建Java程序中线程池的详解

    为了解决这些问题,Java 提供了线程池(ThreadPool)的概念。 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。它预先创建了一定数量的线程,当任务到来时,可以立即...

    Java线程池文档

    Java线程池是一种高效管理线程的机制,它允许开发者预先设定线程的数量,并通过池化的方式重用已创建的线程,以提高系统性能,减少线程的创建和销毁开销。线程池在Java中是通过`java.util.concurrent`包下的`...

    java threadpool

    Java线程池ThreadPool是Java并发编程中的一种机制,允许开发者将任务提交到线程池中,并由线程池管理这些任务的执行。Java线程池的主要作用是:提高系统的响应速度、提高系统的可扩展性、提高系统的灵活性、减少系统...

    Quartz 线程池

    Quartz 提供了多种方式来配置线程池,主要通过 `org.quartz.SchedulerFactory` 和 `org.quartz.ThreadPool` 接口实现。以下是一些常见的配置项: - **ThreadPoolSize**:设置线程池的大小,即最大并发执行的 Job ...

    线程池(Java实现,简易)

    先构造ThreadPool对象,然后调用其execute方法,将自己的线程作为参数传入即可(注意,不能让你的线程开启) 支持最小线程数 支持最大线程数(线程增加后不会减少) 支持线程增长阀值 支持简单日志记录

    JAVA线程池的原理与实现.pdf

    Java线程池是一种高效利用系统资源、管理并发执行任务的机制。它的原理是通过预先创建一组线程,这些线程在任务到来时可以立即执行,而不是每次需要执行任务时都新建线程,从而降低了线程创建和销毁带来的开销。...

    JAVA 自定义线程池的最大线程数设置方法

    JAVA 自定义线程池的最大线程数设置方法 JAVA 自定义线程池的最大线程数设置方法是指在创建线程池时,设置线程池的最大线程数,以确保线程池的高效运行。线程池的最大线程数设置方法主要取决于任务的类型,即CPU...

    Android多线程:完全解析线程池ThreadPool原理&使用

    具体如下上述6个参数的配置决定了线程池的功能,具体设置时机=创建线程池类对象时传入ThreadPoolExecutor类=线程池的真正实现类开发者可根据不同需求配置核心参数,从而实现自定义线程池注:Java里已内置4种常用的...

    在spring boot中使用java线程池ExecutorService的讲解

    1. 线程池管理器(ThreadPool):用于创建并管理线程池,包括创建线程池,销毁线程池,添加新任务。 2. 工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务。 3. 任务接口(Task...

Global site tag (gtag.js) - Google Analytics