zoukankan      html  css  js  c++  java
  • Java队列——线程池创建的例子

      线程池为线程生命周期开销问题和资源不足问题提供了解决方案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。其好处是,因为在请求到达时线程已经存在,所以无意中也消除了线程创建所带来的延迟。这样,就可以立即为请求服务,使应用程序响应更快。而且,通过适当地调整线程池中的线程数目,也就是当请求的数目超过某个阈值时,就强制其它任何新到的请求一直等待,直到获得一个线程来处理为止,从而可以防止资源不足。

    具体的线程池详细见解 如: http://www.importnew.com/19011.html

    使用spring管理线程池的使用

    1、创建线程池的配置信息threads.properties

    ####业务线程池配置####
    #是否启用自定义线程池。true时启动,以下参数生效
    handler.threads.custom=false
    #核心线程数
    handler.threads.corePoolSize=20
    #最大线程数
    handler.threads.maximumPoolSize=1000
    #空闲线程存活时间,单位秒
    handler.threads.keepAliveTime=100
    #工作队列大小,为0是无限大
    handler.threads.workQueue=0

    2、创建 线程池 配置,ThreadsPoolConfig.java

    package com.hk.core.concurrent;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    
    /**
     * 线程池 配置
     */
    @Component
    public class ThreadsPoolConfig {
    
        /**
         * 是否开启自定义线程池
         */
        @Value("${handler.threads.custom}")
        private boolean custom;
        /**
         * 核心线程数
         */
        @Value("${handler.threads.corePoolSize}")
        private int corePoolSize;
        /**
         * 线程池最大线程数
         */
        @Value("${handler.threads.maximumPoolSize}")
        private int maximumPoolSize;
        /**
         * 空闲线程存活时间(对核心线程无效)
         */
        @Value("${handler.threads.keepAliveTime}")
        private long keepAliveTime;
        /**
         * 任务队列大小,0时为无界队列
         */
        @Value("${handler.threads.workQueue}")
        private int workQueue;
    
        public boolean isCustom() {
            return custom;
        }
    
        public void setCustom(boolean custom) {
            this.custom = custom;
        }
    
        public int getCorePoolSize() {
            return corePoolSize;
        }
    
        public void setCorePoolSize(int corePoolSize) {
            this.corePoolSize = corePoolSize;
        }
    
        public int getMaximumPoolSize() {
            return maximumPoolSize;
        }
    
        public void setMaximumPoolSize(int maximumPoolSize) {
            this.maximumPoolSize = maximumPoolSize;
        }
    
        public long getKeepAliveTime() {
            return keepAliveTime;
        }
    
        public void setKeepAliveTime(long keepAliveTime) {
            this.keepAliveTime = keepAliveTime;
        }
    
        public int getWorkQueue() {
            return workQueue;
        }
    
        public void setWorkQueue(int workQueue) {
            this.workQueue = workQueue;
        }
        
    }

    3、创建 线程池 处理器管理线程 HandlerThreadsPool.java

    package com.hk.core.concurrent;
    
    import java.util.concurrent.BlockingQueue;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.LinkedBlockingQueue;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    
    import javax.annotation.PreDestroy;
    
    /**
     * 线程管理器
     */
    public class HandlerThreadsPool {
    
        public ExecutorService executorService;
        
        public HandlerThreadsPool() {
            // TODO Auto-generated constructor stub
            this.executorService=Executors.newCachedThreadPool();
        }
        
        public HandlerThreadsPool(ThreadsPoolConfig config) {
            // TODO Auto-generated constructor stub
            if(config.isCustom()){
                BlockingQueue<Runnable> queue=null;
                if(config.getWorkQueue()>0){
                    queue=new LinkedBlockingQueue<Runnable>(config.getWorkQueue()); // 一般使用 LinkedBlockingQueue 队列
                }else{
                    queue=new LinkedBlockingQueue<Runnable>();
                }
            // 配置线程池信息
    this.executorService=new ThreadPoolExecutor( config.getCorePoolSize(), config.getMaximumPoolSize(), config.getKeepAliveTime(), TimeUnit.SECONDS, queue, new ThreadPoolExecutor.AbortPolicy()//拒绝策略,任务队列满后,新的任务将被丢弃,并抛出异常 ); }else{ this.executorService=Executors.newCachedThreadPool(); } }

    /*
       * 创建线程,对线程处理事件
    */
    public void execute(Runnable runnable){ executorService.execute(runnable); } /*
       * 对象销毁时,销毁线程
       */
    @PreDestroy
    public void stop() { executorService.shutdown(); } }

    4、使用线程池

    package com.hk.core.concurrent;
    
    import javax.annotation.PostConstruct;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class MsgHandler implements Runnable{
    
        
        @Autowired
        private  ThreadsPoolConfig config;  // 注入 配置
        
        @Override
        public void run() {
           // do 这里 写 处理的逻辑
            System.out.println("创建线程 处理事务....");
        }
    
        
        @PostConstruct
        public void loadThreadsPool(){
            
            // 初始化 线程池
            HandlerThreadsPool handlerThreadsPool=new HandlerThreadsPool(config); 
            
            //调用线程池,创建线程  。处理事件
            handlerThreadsPool.execute(new MsgHandler());
        }
    }

    简单的例子就这样完美使用线程池了

  • 相关阅读:
    使用PHP Socket 编程模拟Http post和get请求
    php socket客户端及服务器端应用实例
    php五大运行模式CGI,FAST-CGI,CLI,ISAPI,APACHE模式浅谈
    php 连接 mssql sql2008
    开源内容管理系统Joomla正式发布3.5版本 基于PHP 7
    swift--使用 is 和 as 操作符来实现类型检查和转换 / AnyObject与Any的区别
    swift--获取window
    ios开发之--ios11适配:TableView的heightForHeaderInSection设置高度无效/UISearchBar消失
    swift--触摸(UITouch)事件(点击,移动,抬起)
    swift--添加新手引导页
  • 原文地址:https://www.cnblogs.com/lemon-flm/p/7879014.html
Copyright © 2011-2022 走看看