`

利用Doug Lea的并发包实现带超时机制的线程池

阅读更多
利用Doug Lea的并发包实现带超时机制的线程池
    jdk5引入的concurrent包来自于Doug Lea的卓越贡献。最近我在查找服务器OOM的原因之后,决定采用这个包重写应用中一个servlet,这个servlet调用了一个阻塞方法,当被阻塞之后,服务器中的线程数(因为阻塞了,后续请求不断地新增线程)突然增加导致了服务器当机,因此决定采用一个线程池,并且设置超时,如果阻塞方法超过一定时间就取消线程。因为我们的项目仍然跑在jdk 1.4.2上面,短期内不可能升级到jdk5,还是要利用这个并发包。去这里下载源码并自己打包成jar,加入项目的lib,然后利用PooledExecutor和TimedCallable来实现我们的需求。首先是线程池,相当简单:
import EDU.oswego.cs.dl.util.concurrent.BoundedBuffer;
import EDU.oswego.cs.dl.util.concurrent.PooledExecutor;
/**
* <p>类说明:线程池</p>
* <p>注意事项:</p>
* <pre></pre>
* <p>创建日期:Sep 7, 2007 1:25:33 PM</p>
* @author:dennis zane
* @version $Id:$
*/
public class MyThreadPool{
    private static PooledExecutor exec = new PooledExecutor(new BoundedBuffer(
            20), 30);
    static {
        exec.setKeepAliveTime(1000 * 60 * 5);
        exec.createThreads(5);
        exec.setMinimumPoolSize(4);
    }

    public static void execute(final Runnable r)  throws InterruptedException{
        exec.execute(r);
    }

    public static void shutdown() {
        exec.shutdownAfterProcessingCurrentlyQueuedTasks();
        exec = null;
    }

}


    静态初始化并设置一个PoolExecutor,设置空闲线程的存活时间为5分钟,设置最小线程数为4,最大线程数为30,一开始创建5个线程以待使用(根据各自的应用调整这些参数),另外提供了shutdown方法以供ServeltContextListener的contextDestroyed 方法调用以关闭线程池。那么,结合TimedCallable来实现提交线程的超时机制,调用类似:
           //设置超时时间
           private static final long timeout = 1000;
           ......
           ......
       try{
           Callable callable = new Callable() {
                public Object call() {
                    return new YourProgram().run();                  
                }
            };
            TimedCallable timedCallable = new TimedCallable(callable, timeout);
            FutureResult future = new FutureResult();
            Runnable cmd = future.setter(timedCallable);
            //提交给线程池来执行
            MyThreadPool.execute(cmd);
            //获取任务结果
            YourObject obj= (YourObject) future.get();
            ......
            ......
         } catch (InterruptedException e) {
            if (e instanceof TimeoutException) {
                 log.error("任务超时");
                  ...
             }
         }catch(InvocationTargetException e)
         {
            //清理任务..
         }
         ......
如果不是很理解这段代码,那么也许你应该先看看jdk5引入的Future、FutureTask等类,或者看看这里的文档。对于超时时间的大小估算,你应当在生产环境中计算该阻塞方法的调用时间,正常运行一段时间,利用脚本语言(比如ruby、python)分析日志以得到一个调用花费时间的最大值作为timeout,这里的单位是毫秒。而线程池大小的估算,要看你提交给线程执行的任务的类型:如果是计算密集型的任务,那么线程池的大小一般是(cpu个数+1);如果是IO密集型的任务(一般的web应用皆是此类),那么估算有一个公式,
假设N-cpu是cpu个数,U是目标CPU使用率,W/C是任务的等待时间与计算时间的比率,那么最优的池大小等于:
N-threads=N-cpu*U*(1+W/C)
分享到:
评论

相关推荐

    cpp-一个C版本的DougLea的优秀malloc实现

    《C语言实现的Doug Lea malloc详解》 Doug Lea的malloc是一个著名的内存分配器,以其高效、可扩展和健壮性而闻名。这个优秀的malloc实现最初是为Java语言设计的,但其核心思想和算法同样适用于C语言,因此出现了这...

    Doug Lea, Concurrent Programming in Java Design Principles and Patterns

    《Doug Lea, Concurrent Programming in Java Design Principles and Patterns》是一本深入探讨Java并发编程的经典著作,由Doug Lea撰写。这本书对于理解Java平台上的多线程编程和并发设计模式至关重要,是许多Java...

    Java并发编程-Doug Lea

    Java并发编程原汁原味英文版,Doug Lea大神经典著作, 内容:Concurrency Models, design forces, Java Designing objects for concurrency Immutability, locking, state dependence, containment, splitting ...

    java并发编程实践 432页完全版part2 绝版好书doug lea等大师级合著 第二部分

    java并发编程实践 432页完全版 绝版好书doug lea等大师级合著 第二部分java并发编程实践 432页完全版 绝版好书doug lea等大师级合著 第二部分java并发编程实践 432页完全版 绝版好书doug lea等大师级合著 第二部分

    java并发编程实践part1共两部分 432页完全版 绝版好书doug lea等大师级合著 共两部分

    java并发编程实践 432页完全版 绝版好书doug lea等大师级合著java并发编程实践 432页完全版 绝版好书doug lea等大师级合著java并发编程实践 432页完全版 绝版好书doug lea等大师级合著

    并发大神DougLea文章集锦

    "并发大神DougLea文章集锦" Doug Lea是并发编程领域的传奇人物,他的作品对Java并发编程产生了深远的影响。本资源摘要信息整理了Doug Lea的主要作品和研究方向,涵盖了Java并发编程、对象oriented系统开发、并发...

    Scalable IO in Java by Doug Lea

    《Scalable IO in Java by Doug Lea》是Java NIO领域的经典文献,由Java并发包(java.util.concurrent)的设计者Doug Lea撰写。NIO,全称非阻塞输入/输出(Non-blocking Input/Output),是Java平台从1.4版本开始引入...

    Doug Lea Scalable IO in Java

    他还讲解了如何利用NIO来实现高效的数据读写,包括文件I/O、网络I/O等,并提供了实用的代码示例。 此外,书中还涵盖了线程池、同步机制、并发工具类等与NIO紧密相关的主题。这些内容对于理解和优化Java并发程序至关...

    doug lea《Scalable IO in Java》

    3. **并发与多线程**:在处理I/O事件时如何利用线程池和同步机制来优化性能。 4. **性能优化策略**:如缓冲区大小的选取、线程池的配置、内存管理等,以最大化系统资源的利用。 5. **案例分析**:可能包含实际应用中...

    1999+-+Concurrent+Programming+in+Java[1].+Design+Principles+and+Pattern+2nd-ed+-+Doug+Lea.rar

    Doug Lea作为Java并发领域的权威,他的作品对于理解Java内存模型、线程安全、同步机制等具有重要指导意义。本书主要涵盖以下几个核心知识点: 1. **Java并发基础**:介绍Java平台的并发特性,包括线程的创建与管理...

    DougLea Malloc源代码

    Malloc实际上有很多版本(DougLea Malloc/BSD Malloc/Hoard Malloc/)DougLea Malloc源码,LINUX GNU MALLOC是其衍生版本

    concurrent programming in java(doug lea)

    《Java并发编程》一书是由著名并发编程专家Doug Lea所著,他同时也是Java并发包(JUC)的作者,这本书详细介绍了Java多线程编程的基础概念和高级技术。 首先,书中提到了并发编程的基本概念,包括并发模型、设计力...

    Doug Lea出色的malloc()实现的C ++版本。-C/C++开发

    dlmalloc Doug Lea出色的malloc()实现的C ++版本。 我一直在Windows上的malloc()实现方面遇到问题,在这种情况下,随着连续r dlmalloc的某些模式的出现,内存使用可能会过分增大,这是Doug Lea出色的malloc()...

    Scalable IO in Java -Doug Lea.rar

    从提供的文件列表来看,"Scalable IO in Java -Doug Lea.pdf"可能是该主题的详细论述,而"1.pptx"可能是相关的演示文稿或课程幻灯片,它们将更深入地阐述这些概念并提供实例分析。阅读这些材料,开发者可以学习如何...

    Scalable IO in Java -Doug Lea

    Lea通过示例展示了如何用单线程或线程池实现服务器,以及如何定义Handler类来处理连接。Handler类负责读取输入数据、处理数据、生成输出数据,并将结果写回给客户端。这种设计模式允许每个Handler在自己的线程中运行...

    Scalable IO in Java doug lea.zip

    《Scalable IO in Java》是由Java领域知名专家Doug Lea撰写的一本关于Java高性能I/O编程的著作。这本书深入探讨了如何在Java环境中实现可扩展的输入/输出操作,特别是利用非阻塞I/O(Non-blocking I/O,简称NIO)...

    JAVA并发编程实践 中文 高清 带书签 完整版 Doug Lea .pdf

    根据提供的文件信息,“JAVA并发编程实践 中文 高清 带书签 完整版 Doug Lea .pdf”,我们可以推断出这份文档主要聚焦于Java并发编程的技术实践与理论探讨。下面将从多个角度来解析这个文档可能涵盖的关键知识点。 ...

    JAVA并发编程实践JavaConcurrencyinPractice-中文-高清-带书签-完整版Doug Lea 等著

    根据提供的文件信息,本书《JAVA并发编程实践JavaConcurrencyinPractice》由Doug Lea等著名作者撰写,是一本关于Java并发编程的专业书籍。本书主要聚焦于Java并发编程的基础理论与实践应用,适合对Java并发机制感...

Global site tag (gtag.js) - Google Analytics