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

JDK自带线程池学习

阅读更多

 

转:http://guoliangqi.iteye.com/blog/630086

线程池主类:

Java代码 复制代码 收藏代码
  1. import java.util.concurrent.LinkedBlockingQueue;   
  2. import java.util.concurrent.ThreadPoolExecutor;   
  3. import java.util.concurrent.TimeUnit;   
  4.   
  5. public class DataHandlerThreadPool {   
  6.     //核心线程数量,即初始化线程池的启动线程数量   
  7.     private static final int corePoolSize = 10;   
  8.     //最大线程数量   
  9.     private static final int maximumPoolSize = 20;   
  10.     //线程的存活时间,即完成任务后多久可再使用   
  11.     private static final int keepAliveTime = 300;   
  12.     //等待队列的长度   
  13.     private static final int workQueueSize = 30;   
  14.     private static ThreadPoolExecutor exec = null;   
  15.   
  16.     public static ThreadPoolExecutor getDHThreadPool() {   
  17.         if (exec == null) {   
  18.             //ThreadPoolExceptionHandler表示当线程池处理不了规定任务时的异常处理方式。   
  19.             exec = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.MILLISECONDS,   
  20.                     new LinkedBlockingQueue(workQueueSize), new ThreadPoolExceptionHandler());   
  21.         }   
  22.         return exec;   
  23.     }   
  24.   
  25. }  
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class DataHandlerThreadPool {
    //核心线程数量,即初始化线程池的启动线程数量
    private static final int corePoolSize = 10;
    //最大线程数量
    private static final int maximumPoolSize = 20;
    //线程的存活时间,即完成任务后多久可再使用
    private static final int keepAliveTime = 300;
    //等待队列的长度
    private static final int workQueueSize = 30;
    private static ThreadPoolExecutor exec = null;

    public static ThreadPoolExecutor getDHThreadPool() {
        if (exec == null) {
            //ThreadPoolExceptionHandler表示当线程池处理不了规定任务时的异常处理方式。
            exec = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.MILLISECONDS,
                    new LinkedBlockingQueue(workQueueSize), new ThreadPoolExceptionHandler());
        }
        return exec;
    }

}

 

线程池异常处理类:

Java代码 复制代码 收藏代码
  1. import java.util.concurrent.RejectedExecutionHandler;   
  2. import java.util.concurrent.ThreadPoolExecutor;   
  3.   
  4. public class ThreadPoolExceptionHandler implements RejectedExecutionHandler {   
  5.   
  6.     public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {   
  7.   
  8.         System.out.println("线程池出现异常!");   
  9.   
  10.     }   
  11.   
  12. }  
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;

public class ThreadPoolExceptionHandler implements RejectedExecutionHandler {

    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {

        System.out.println("线程池出现异常!");

    }

}

 

任务实例,只需要实现Runnable接口就行

Java代码 复制代码 收藏代码
  1. public class ThreadPoolTask implements Runnable {   
  2.   
  3.     public void run() {   
  4.         System.out.println("在这里执行业务逻辑和要执行的方法");   
  5.     }   
  6.   
  7. }  
public class ThreadPoolTask implements Runnable {

    public void run() {
        System.out.println("在这里执行业务逻辑和要执行的方法");
    }

}

 

执行测试类:

Java代码 复制代码 收藏代码
  1. import java.util.concurrent.ThreadPoolExecutor;   
  2.   
  3. public class TestMain {   
  4.   
  5.     /**  
  6.      * @param args  
  7.      */  
  8.     public static void main(String[] args) {   
  9.         ThreadPoolExecutor executor = DataHandlerThreadPool.getDHThreadPool();   
  10.         //适当控制i的循环次数,可以看到打印出的信息,有的是执行业务逻辑,有的是在线程异常处理类里   
  11.         for (int i = 0; i < 100; i++) {   
  12.             executor.execute(new ThreadPoolTask());   
  13.         }   
  14.     }   
  15. }  
import java.util.concurrent.ThreadPoolExecutor;

public class TestMain {

    /**
     * @param args
     */
    public static void main(String[] args) {
        ThreadPoolExecutor executor = DataHandlerThreadPool.getDHThreadPool();
        //适当控制i的循环次数,可以看到打印出的信息,有的是执行业务逻辑,有的是在线程异常处理类里
        for (int i = 0; i < 100; i++) {
            executor.execute(new ThreadPoolTask());
        }
    }
}

 

exec = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,
keepAliveTime, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue(workQueueSize),
new ThreadPoolExceptionHandler());

实例化线程池的方法,在倒数第二个参数 new LinkedBlockingQueue(workQueueSize)可以设置等待队列的形式,有无限队列,有规定队列,有固定的数组等等。

分享到:
评论

相关推荐

    JDK自带线程池分析

    JDK自带线程池分析 JDK 自带线程池是 Java 语言中用于管理和执行线程的工具,旨在提高多线程编程的效率和灵活性。本文将详细介绍 JDK 自带线程池的组成、创建方法、优点和常见应用场景。 多线程技术 多线程技术是...

    jdk自带线程池实例详解

    jdk自带线程池实例详解 jdk自带的线程池是Java开发中一个非常重要的概念,特别是在多线程编程中。线程池是线程的容器,每次只执行额定数量的线程,线程池就是用来管理这些额定数量的线程。下面我们来详细了解jdk...

    tomcat7内置jdk版

    “相关的性能参数已经优化好”意味着开发者可能已经调整了Tomcat的默认配置,例如线程池大小、内存分配、连接超时等关键参数,以提高其在特定工作负载下的性能表现。这有助于在服务器高负载下保持良好的响应速度和...

    jdk_api_1_6中文版

    5. `jconsole`:JDK自带的JVM监控工具,提供性能分析和内存管理等功能。 6. `jmap`:用于查看堆内存详细信息,辅助诊断内存泄漏问题。 四、JDK 1.6的开发实践 在实际开发中,JDK 1.6广泛应用于企业级应用、桌面...

    _JAVA线程池介绍以及简单实例.doc

    Java线程池是一种高效利用系统资源的机制,它允许开发者预先配置一定数量的线程,以便在...通过对JDK自带的`ThreadPoolExecutor`源码的学习,我们可以更深入地了解线程池的工作细节,以便更好地利用这一强大的工具。

    简单的JAVA HTML服务器

    实现原理为采用Socket原理、线程池、输入输出流及简单的HTTP协议,麻烦虽小,五脏俱全,...JAR编译的JDK版本1.6,至少要JDK1.5以上,因为其中用到JDK自带的线程池,内附源码,用户可以自已将源码再打包。 下载路径为:

    [Java参考文档].JDK_API_1_6_zh_CN.CHM百度网盘下载地址

    Java 的官方文档——JDK API 文档提供了所有类、接口、方法以及构造器等的详细说明,是学习和使用 Java 的重要资源之一。 ### 2. JDK API 1.6 版本概述 JDK(Java Development Kit)是开发 Java 应用程序的基础...

    MThread:实现线程池已有的功能,同时对线程池的本身的使用与运行情况提供监控;与ILog组件配合使用,可以实现线程上下文的自动切换

    普通JDK自带的线程池时无法实现线程池的自动切换,基于监控与上下文自动切换的需求,封住了一套taxi开头的线程池,接入方式很简单,它的使用方式与Jdk的使用基本方式一致,只需在对应的类前加一个Taxi,现将对应方式...

    Java 高并发六:JDK并发包2详解

    JDK提供了一系列的线程池实现,包括`ThreadPoolExecutor`、`ScheduledThreadPoolExecutor`以及`Executors`工厂类。`ThreadPoolExecutor`是线程池的核心实现,它接受五个参数进行初始化: 1. `corePoolSize`: 核心...

    7000字+24张图带你彻底弄懂线程池.doc

    RejectedExecutionHandler 的实现 JDK 自带的默认有 4 种: * AbortPolicy:丢弃任务,抛出运行时异常 * CallerRunsPolicy:由提交任务的线程来执行任务 * DiscardPolicy:丢弃这个任务,但是不抛异常 * ...

    Mina2.0学习笔记

    - **使用JDK自带线程池的阻塞服务器**:进一步优化线程管理。 - **NIO基础知识**:介绍Buffer、Channel、Selector等基本概念。 - **基于NIO的阻塞服务器**:利用NIO特性改进阻塞模式。 - **基于NIO的非阻塞...

    如何查看服务器配置 Myeclipse如何配置Tomcat服务器和JDK.pdf

    MyEclipse自带的JDK可能不是你想要使用的版本,或者你可能希望针对特定项目使用不同的JDK。在Tomcat配置界面,选择“JRE”选项卡,点击“Add”按钮。在弹出的窗口中,浏览并选择你系统中安装的JDK路径,然后点击...

    JDK12-java-se-monitoring-and-management-guide.pdf

    这涉及到使用JDK自带的工具如`jstat`、`jmap`、`jhat`和`jfr`(Java飞行记录器)等。 4. **垃圾回收**:垃圾回收是Java性能管理的重要方面,指南提供了关于不同垃圾收集器的详细信息,如G1、Shenandoah、ZGC等,...

    jvm优化学习资源学习及讲义说明

    4. **性能监控工具**:熟悉JDK自带的JConsole、VisualVM和JProfiler等工具,用于实时监控JVM的运行状态,包括内存使用、线程状态、CPU消耗等,以及如何通过这些工具进行问题定位。 5. **类加载机制**:掌握双亲委派...

    Java问题定位技术.pdf

    在介绍Java泥潭问题时,文档提到了Runtime.getRuntime().exec()的不稳定性和JDK自带的Timer类的使用场合,以及池的合理设计,例如对象池、线程池和连接池的设计。还特别提醒了JDK1.5线程池和Timer使用的陷阱。 最后...

    子线程任务发生异常,主线程事务如何回滚

    常用的线程池有两种:JDK 自带的和 Spring 线程池。 在本文中,我们使用 Spring API 来构建一个线程池。线程池可以避免线程无限制的被创建,避免应用资源无限制的被占用导致的系统宕掉的问题。 三、异常的捕获 当...

    java自带并发框架

    Java自带的并发框架通过提供高级的并发工具和类,使开发者能够更安全、更高效地编写多线程程序,避免了直接操作底层并发原语带来的复杂性和潜在风险。通过理解和熟练使用这些工具,我们可以构建出更健壮、更具伸缩性...

    Mina2.0学习笔记(重点)

    3. **使用JDK自带线程池的阻塞服务器**:通过线程池管理线程资源,提高了资源利用率,减少了线程创建销毁的开销。 4. **NIO基础知识**:介绍了NIO的基本概念,包括缓冲区(Buffer)、通道(Channel)、选择器(Selector)...

    Java高并发编程与JVM性能调优实战 视频教程 下载下载因为太大存百度云盘4.zip

    5. **JVM调优工具**:学习使用JDK自带的JConsole、VisualVM、JFR等工具进行性能监控和分析,以及如何通过JVM日志分析系统瓶颈。 6. **类加载机制**:理解类加载过程(加载、验证、准备、解析、初始化),探讨双亲...

Global site tag (gtag.js) - Google Analytics