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

  • 相关阅读:
    HDU 5744
    HDU 5815
    POJ 1269
    HDU 5742
    HDU 4609
    fzu 1150 Farmer Bill's Problem
    fzu 1002 HangOver
    fzu 1001 Duplicate Pair
    fzu 1150 Farmer Bill's Problem
    fzu 1182 Argus 优先队列
  • 原文地址:https://www.cnblogs.com/litblank/p/7922156.html
Copyright © 2011-2022 走看看