zoukankan      html  css  js  c++  java
  • ThreadPoolExecutor 线程池

    TestThreadPoolExecutorMain

    package core.test.threadpool;
    
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    
    /**
     * ThreadPoolExecutor 线程池
     * 构造函数参数
     * 
     * 1、corePoolSize 核心线程数大小,当线程数 < corePoolSize ,会创建线程执行 runnable
     * 
     * 2、maximumPoolSize 最大线程数, 当线程数 >= corePoolSize的时候,会把 runnable 放入 workQueue中
     * 
     * 3、keepAliveTime 保持存活时间,当线程数大于corePoolSize的空闲线程能保持的最大时间。
     * 
     * 4、unit 时间单位
     * 
     * 5、workQueue 保存任务的阻塞队列
     * 
     * 6、threadFactory 创建线程的工厂
     * 
     * 7、handler 拒绝策略
     * 
     * 任务执行顺序    (核心线程数,阻塞队列,最大线程数,异常)
     * 
     * 1、当线程数小于 corePoolSize时,创建线程执行任务。
     * 
     * 2、当线程数大于等于 corePoolSize并且 workQueue 没有满时,放入workQueue中
     * 
     * 3、线程数大于等于 corePoolSize并且当 workQueue 满时,新任务新建线程运行,线程总数要小于 maximumPoolSize
     * 
     * 4、当线程总数等于 maximumPoolSize 并且 workQueue 满了的时候执行 handler 的
     * rejectedExecution。也就是拒绝策略。
     * 
     * 四个拒绝策略
     * 
     * ThreadPoolExecutor默认有四个拒绝策略:
     * 
     * 1、ThreadPoolExecutor.AbortPolicy() 直接抛出异常RejectedExecutionException
     * 
     * 2、ThreadPoolExecutor.CallerRunsPolicy() 直接调用run方法并且阻塞执行
     * 
     * 3、ThreadPoolExecutor.DiscardPolicy() 直接丢弃后来的任务
     * 
     * 4、ThreadPoolExecutor.DiscardOldestPolicy() 丢弃在队列中队首的任务
     * 
     * 当然可以自己继承RejectedExecutionHandler来写拒绝策略.
     * 
     * @author chenyd 2017年10月24日
     */
    public class TestThreadPoolExecutor {
        public static void main(String[] args) {
            Long currentTimeMillis = System.currentTimeMillis();
            // new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,
            // unit, workQueue)
            ThreadPoolExecutor threadpool = new ThreadPoolExecutor(3, 10, 3, TimeUnit.SECONDS,
                    new ArrayBlockingQueue<Runnable>(3));
    
            for (int i = 0; i < 100; i++) {
    
                try {
                    String task = "task=" + i;
                    System.out.println("创建任务并提交到线程池:" + task);
                    threadpool.execute(new ThreadPoolTast(task));
    
                    Thread.sleep(100);
                } catch (Exception e) {
                    e.printStackTrace();
                }
    
            }
    
            try {
                threadpool.shutdown();
                boolean loop = true;
    
                do {
                    loop = !threadpool.awaitTermination(2, TimeUnit.SECONDS);
                } while (loop);
    
                if (loop != true) {
                    System.out.println("所有线程执行完毕");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                System.out.println("耗时:" + (System.currentTimeMillis() - currentTimeMillis));
            }
    
        }
    }

    ThreadPoolTast

    package core.test.threadpool;
    
    import java.io.Serializable;
    
    public class ThreadPoolTast implements Runnable, Serializable {
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        
        private Object attachData;
        
        public ThreadPoolTast(Object tasks) {
            this.attachData=tasks;
        }
    
        @Override
        public void run() {
            
            try {
                System.out.println("开始执行任务:"+attachData+"任务,使用线程池,线程名称:"+Thread.currentThread().getName());
            } catch (Exception e) {
                e.printStackTrace();
            }
            
            attachData=null;
            
        }
    }

    参考链接:

    Java四种线程池的使用 http://cuisuqiang.iteye.com/blog/2019372

  • 相关阅读:
    React-Native 之 GD (二十一)APP 打包
    React-Native 之 GD (十九)TabBarItem 逻辑完善 / 关闭筛选菜单滑动手势 / Navigator 掉帧卡顿问题处理
    React-Native 之 GD (二十)removeClippedSubviews / modal放置的顺序 / Android 加载git图动图 / 去除 Android 中输入框的下划线 / navigationBar
    React-Native 之 GD (十六)首页筛选功能
    React-Native 之 GD (十七)小时风云榜按钮处理
    React-Native 之 GD (十八)监听 TabBarItem 点击与传值实现 点击 Item 进行刷新功能
    SettingsPLSQLDeveloper
    UsageLog4j
    SettingsJDK
    UsageGrideReport++
  • 原文地址:https://www.cnblogs.com/litblank/p/7922156.html
Copyright © 2011-2022 走看看