`
henxingliwang
  • 浏览: 11395 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

JAVA线程池管理的实现

阅读更多

闲来无聊,总结一下自己对线程池理解。这里实现了线程池之外的任务缓冲队列
我看过很多项目,在实现线程池的时候超过缓冲队列大小时放弃最旧的未处理请求
总觉得不太好,现在加上外部缓冲队列看似解决了丢失任务问题确又产生了新的问题
关于异常任务会累积在队列还真不好处理。以后再看吧!!!

import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 线程池管理
 * @author LW
 * @date 2011-2-12
 */
public class ThreadPoolManager {
 
 private static ThreadPoolManager tpm = new ThreadPoolManager();

 // 线程池维护线程的最少数量
 private final static int CORE_POOL_SIZE = 3;

 // 线程池维护线程的最大数量
 private final static int MAX_POOL_SIZE = 10;

 // 线程池维护线程所允许的空闲时间
 private final static int KEEP_ALIVE_TIME = 0;

 // 线程池所使用的缓冲队列大小
 private final static int WORK_QUEUE_SIZE = 10;

 // 任务调度周期
 private final static int TASK_QOS_PERIOD = 10;

 // 任务缓冲队列
 private Queue<Runnable> taskQueue = new LinkedList<Runnable>();

 /*
  * 线程池超出界线时将任务加入缓冲队列
  */
 final RejectedExecutionHandler handler = new RejectedExecutionHandler() {
  public void rejectedExecution(Runnable task, ThreadPoolExecutor executor) {
   taskQueue.offer(task);
  }
 };

 /*
  * 将缓冲队列中的任务重新加载到线程池
  */
 final Runnable accessBufferThread = new Runnable() {
  public void run() {
   if (hasMoreAcquire()) {
    threadPool.execute(taskQueue.poll());
   }
  }
 };

 /*
  * 创建一个调度线程池
  */
 final ScheduledExecutorService scheduler = Executors
   .newScheduledThreadPool(1);

 /*
  * 通过调度线程周期性的执行缓冲队列中任务
  */
 final ScheduledFuture<?> taskHandler = scheduler.scheduleAtFixedRate(
   accessBufferThread, 0, TASK_QOS_PERIOD, TimeUnit.MILLISECONDS);

 /*
  * 线程池
  */
 final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
   CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS,
   new ArrayBlockingQueue<Runnable>(WORK_QUEUE_SIZE), this.handler);

 /*
  * 将构造方法访问修饰符设为私有,禁止任意实例化。
  */
 private ThreadPoolManager() {

 }

 /*
  * 线程池单例创建方法
  */
 public static ThreadPoolManager newInstance() {
  return tpm;
 }

 /*
  * 消息队列检查方法
  */
 private boolean hasMoreAcquire() {
  return !taskQueue.isEmpty();
 }

 /*
  * 向线程池中添加任务方法
  */
 public void addExecuteTask(Runnable task) {
  if (task != null) {
   threadPool.execute(task);
  }
 }
}

 

分享到:
评论
7 楼 SINCE1978 2011-03-10  
我觉得这件事就不应该去做
服务器如果还有处理任务的余量大事线程池却满了,那属于你的线程池大小没有规划好的问题,一些用到线程池的服务端软件都有自己的一套帮助你规划好线程池尺寸的公式,如果你觉得直接抛弃最老任务的方式不好,是否可以给等待队列一个极大的尺寸?如果队列也满了,那说明存在其他问题,比如说处理的任务有死循环,或者是服务器硬件满足不了要求。这时再去解决该解决的问题。
6 楼 agapple 2011-03-08  
一种实现,复写execute和beforeExecute方法。

比如使用信号量或者原子变量控制,满了后可阻塞或者加入到自定义的taskQueue等。
5 楼 peak 2011-03-07  
concurrent包里面什么都写好了,何必我们去重写一遍呢
4 楼 henxingliwang 2011-03-07  
thebye85 写道
可以不用调度线程。重写ThreadPoolExecutor的afterExecute方法,将调度线程的代码移到该方法中。

这个想法很不错,不知道有没有人试过,可行度是多少....
3 楼 thebye85 2011-03-05  
可以不用调度线程。重写ThreadPoolExecutor的afterExecute方法,将调度线程的代码移到该方法中。
2 楼 jerry1985 2011-03-05  
vector 是线程安全的,不妨用这个?
1 楼 zhxing 2011-03-04  
// 任务缓冲队列
private Queue<Runnable> taskQueue = new LinkedList<Runnable>();

首先这个就不对了,LinkedList非线程安全。。

在实现线程池的时候超过缓冲队列大小时放弃最旧的未处理请求。。当池满后这个处理也是合理的。本身池满的情况应该是非常少出现,如果出现很多应该检查你的程序本身流程是否有问题。。

相关推荐

    java线程池完整代码

    标题 "Java 线程池完整代码" 表明了这篇文章的主题是关于 Java 线程池的完整实现代码,涵盖了线程池的基本概念、配置文件的解析、线程池的创建和管理等方面。 描述解析 描述 "Java 线程池完整源码" 说明了这篇文章...

    Java 线程池的原理与实现

    理解Java线程池的原理和实现,可以帮助我们更有效地管理并发任务,提升系统性能,同时避免资源浪费和线程安全问题。在实际开发中,合理配置线程池参数,结合业务场景选择合适的线程池类型,是优化系统性能的关键步骤...

    java 线程池实现多并发队列后进先出

    Java线程池是一种高效管理并发任务的机制,它允许开发者预先配置一定数量的线程,以便在处理多个并发任务时能有效地复用这些线程,从而避免了频繁创建和销毁线程带来的开销。在Java中,`java.util.concurrent`包下的...

    java线程池封装j

    Java线程池是一种高效管理线程的技术,它允许开发者预定义一组线程,根据任务的需要灵活调度,而不是每次需要执行任务时都创建新的线程。这种设计模式大大提高了系统的性能,减少了系统资源的消耗,特别是在高并发...

    自定义实现Java线程池

    ### 自定义实现Java线程池 #### 一、概述 在深入探讨自定义Java线程池之前,我们先简要回顾一下线程池的基本概念及其重要性。线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动...

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

    Java线程池是一种高效利用系统资源、管理并发执行任务的机制。...总的来说,理解Java线程池的工作原理和实现对于优化并发应用程序至关重要,它可以帮助我们更好地控制系统的并发度,提高系统的响应速度和资源利用率。

    java线程池实例详细讲解

    Java线程池是一种高效管理线程资源的工具,它能够帮助开发者有效地控制并调度线程,从而提升系统性能,减少系统资源的浪费。在Java中,`ExecutorService`接口是线程池的主要入口,它是`java.util.concurrent`包的一...

    Java版线程池实现

    Java线程池是一种高效管理并发任务执行的机制,它通过预先创建并维护一定数量的线程,从而避免了频繁地创建和销毁线程所带来的性能开销。在Java中,线程池的实现主要依赖于`java.util.concurrent`包中的`...

    java线程池threadpool简单使用源码

    Java线程池(ThreadPool)是Java并发编程中的一个重要概念,它可以帮助我们有效地管理和控制并发执行的任务,从而提高系统的效率和稳定性。线程池通过复用已存在的线程,避免了频繁创建和销毁线程带来的开销,同时也...

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

    总结来说,自定义Java线程池的实现涉及到线程的管理和调度,包括核心线程的维护、任务队列的使用以及拒绝策略的设定。理解这些机制有助于我们更好地优化并发程序,提高系统效率。然而,在实际开发中,通常推荐使用...

    Java线程池使用说明

    Java线程池是Java并发编程中的重要组件,它能够有效地管理和复用线程,从而提高程序的执行效率和降低资源消耗。在JDK 1.5版本之前,Java对线程池的支持非常有限,而在JDK 1.5之后,加入了java.util.concurrent包,...

    Java线程池文档

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

    基于Java线程池技术的数据爬虫设计与实现.pdf

    本文所提及的基于Java线程池技术的数据爬虫设计与实现,不仅涉及到了数据爬虫的原理和架构,还包括了多线程编程的知识点,以及线程池技术在数据爬虫中的具体应用。 首先,数据爬虫的基本原理是模拟用户的点击行为,...

    Java线程池与ThreadPoolExecutor.pdf

    在Java EE环境中,应用服务器通常有自己的线程池管理,它们可能会根据应用的需求和服务器配置自动调整线程池参数。例如,Servlet容器可能为每个请求分配一个线程,这些线程可能来自服务器内部的线程池。使用...

    java线程池的源码分析.zip

    Java线程池是Java并发编程中的重要组成部分,它在多线程和高并发场景下扮演着关键角色。本文将深入探讨Java线程池的源码分析,并对比不同类型的线程池,以帮助开发者更好地理解和利用这一强大的工具。 首先,我们要...

    Java 线程池.docx

    Java线程池是一种高效管理线程资源的工具,它的出现是为了应对多线程编程中频繁创建和销毁线程带来的性能开销以及资源消耗。在Java中,通过使用线程池,我们可以预先创建一定数量的线程,这些线程在空闲时可以被复用...

    Java实现的线程池、消息队列功能

    标题中的“Java实现的线程池、消息队列功能”是指在Java编程中,如何利用编程技术实现线程池和消息队列这两种重要的并发处理机制。线程池和消息队列是解决多线程环境下资源管理和任务调度的有效手段,它们在高并发、...

    java线程池实例

    Java线程池是一种高效管理线程资源的工具,它通过维护一组可重用的线程来减少创建和销毁线程的开销。在Java中,`java.util.concurrent`包提供了`ExecutorService`接口和它的实现类,如`ThreadPoolExecutor`,来支持...

    Java实现通用线程池

    在 Java 中,线程池可以使用ThreadPoolExecutor类来实现,ThreadPoolExecutor类可以实现线程池的创建、管理和销毁。线程池的核心思想是预先创建一些空闲线程,等到需要用多线程去处理事务的时候去唤醒某些空闲线程...

    JAVA线程池例子

    Java线程池是一种高效管理线程资源的技术,它允许开发者创建一组可重用的工作线程,从而避免频繁地创建和销毁线程带来的性能开销。线程池在Java中主要通过`java.util.concurrent`包中的`ExecutorService`接口及其...

Global site tag (gtag.js) - Google Analytics