• 线程池的爆掉


      在多线程的世界里,如果源源不断的生产线程的话,内存迟早会被吃光,所以就有了能够重复利用线程的线程池。一个请求到来,从池子中捞起一个空闲的线程,带着该请求去处理事情,事情做完后线程回归池里,等待下一位客人。在池子中的线程可以一遍又一遍的使用,避免了线程创建、销毁的开销,但如果请求的到达率高于线程的处理速度呢?池子会随着请求的积累慢慢膨胀,最终爆掉。

      看例子:

    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.FutureTask;
    import java.util.concurrent.TimeUnit;
    
    public class ThreadPoolTest
    {
        // 定义大小弹性伸缩的线程池
        private final ExecutorService es = Executors.newCachedThreadPool();
        
        public static void main(String[] args)
        {
            ThreadPoolTest t = new ThreadPoolTest();
            t.poolTest(1000000, 4, 5);
        }
        
        /**
         * 测试不同线程数量对线程池的冲击
         * 
         * @author wulinfeng
         * @param nThread 每次投入多少线程到线程池中
         * @param nSecondDelay 每个任务的请求数
         * @param nSecondDelay 在每个任务中休眠多少秒
         */
        public void poolTest(int nThread, int nRequestData, int nSecondDelay)
        {
            // 创建任务列表
            List<SubFutureTask<String>> tasks = new ArrayList<SubFutureTask<String>>();
            
            // 创建任务,放入任务列表
            for (int i = 0; i < nThread; i++)
            {
                Callable<String> callable1 = new ResultCallable<String>(nRequestData, nSecondDelay);
                SubFutureTask<String> task1 = new SubFutureTask<String>(callable1);
                tasks.add(task1);
            }
            
            // 从任务列表中获取执行结果
            String result = getSubmitResult(tasks);
            System.out.println(result);
        }
        
        /**
         * 获取结果集
         * 
         * @author wulinfeng
         * @param tasks
         * @return
         */
        private String getSubmitResult(List<SubFutureTask<String>> tasks)
        {
            // 循环遍历出任务对象并提交到Executor
            if (null == es || es.isShutdown())
            {
                return null;
            }
            
            if ((null != tasks && tasks.size() > 0))
            {
                for (int i = 0; i < tasks.size(); i++)
                {
                    es.submit(tasks.get(i));
                }
            }
            
            // 获取结果集
            return (String)getResult(tasks);
        }
        
        /**
         * 包装结果
         * 
         * @author wulinfeng
         * @param tasks
         * @return
         */
        private String getResult(List<SubFutureTask<String>> tasks)
        {
            StringBuilder sb = new StringBuilder();
            if ((null != tasks && tasks.size() > 0))
            {
                for (int i = 0; i < tasks.size(); i++)
                {
                    SubFutureTask<String> task = tasks.get(i);
                    String result = null;
                    if (null != task)
                    {
                        try
                        {
                            // 使用超时时间限制,超时则抛异常
                            Object res = task.get(3000, TimeUnit.MILLISECONDS);
                            if (res instanceof String)
                            {
                                result = (String)res;
                            }
                        }
                        catch (Exception e)
                        {
                            sb.append(String.format("第%d个线程请求超时了
    ", i));
                            e.printStackTrace();
                            continue;
                        }
                    }
                    
                    if (result != null)
                    {
                        sb.append(String.format("第%d个线程:
    ", i));
                        sb.append(result).append('
    ');
                    }
                }
            }
            return sb.toString();
        }
        
        /**
         * 定义任务内容
         * 
         * @author wulinfeng
         * @version C10 2018年9月3日
         * @since SDP V300R003C10
         */
        class ResultCallable<T> implements Callable<T>
        {
            private int nRequestData;
            
            private int nSecondDelay;
            
            public ResultCallable(int nRequet, int nSecondDelay)
            {
                this.nRequestData = nRequet;
                this.nSecondDelay = nSecondDelay;
            }
            
            @Override
            public T call()
                throws Exception
            {
                StringBuilder sb = new StringBuilder();
                
                for (int i = 0; i < nRequestData; i++)
                {
                    // 该请求耗时nSecondDelay秒
                    Thread.sleep(1000 * nSecondDelay);
                    sb.append(String.format("第(%d)次请求数据,线程名:%s,响应时间点:%d
    ",
                        i,
                        Thread.currentThread().getName(),
                        System.currentTimeMillis()));
                }
                return (T)sb.toString();
            }
        }
        
        /**
         * 获取callable对象
         * 
         * @author wulinfeng
         * @version C10 2018年9月3日
         * @since SDP V300R003C10
         */
        class SubFutureTask<V> extends FutureTask<V>
        {
            private Callable<V> callable;
            
            public SubFutureTask(Callable<V> arg0)
            {
                super(arg0);
                this.callable = arg0;
            }
            
            public Callable<V> getCallable()
            {
                return this.callable;
            }
            
        }
    }

      上面用了可缓存线程池,用一百万个线程丢到池子里去,没有任何问题,因为这个池子默认能容纳整形的最大值2147483647。但真跑起来会发现控制台并未打印,看个人电脑性能好坏,有的人可能电脑会变卡,我反正是等了半天都没反应。如果这个池子拿到生产环境用,而且请求量、线程的到达率很大,那么很有可能会吃光内存。所以一般项目都不敢用它。那么固定大小的线程池呢?

      把前面几行改为:

        // 定义固定大小的线程池
        private final ExecutorService es = Executors.newFixedThreadPool(64);
        
        public static void main(String[] args)
        {
            ThreadPoolTest t = new ThreadPoolTest();
            t.poolTest(100, 4, 5);
        }

      跑一把看输出:

    java.util.concurrent.TimeoutException
        at java.util.concurrent.FutureTask.get(FutureTask.java:205)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.getResult(ThreadPoolTest.java:96)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.getSubmitResult(ThreadPoolTest.java:72)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.poolTest(ThreadPoolTest.java:44)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.main(ThreadPoolTest.java:19)
    java.util.concurrent.TimeoutException
        at java.util.concurrent.FutureTask.get(FutureTask.java:205)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.getResult(ThreadPoolTest.java:96)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.getSubmitResult(ThreadPoolTest.java:72)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.poolTest(ThreadPoolTest.java:44)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.main(ThreadPoolTest.java:19)
    java.util.concurrent.TimeoutException
        at java.util.concurrent.FutureTask.get(FutureTask.java:205)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.getResult(ThreadPoolTest.java:96)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.getSubmitResult(ThreadPoolTest.java:72)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.poolTest(ThreadPoolTest.java:44)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.main(ThreadPoolTest.java:19)
    java.util.concurrent.TimeoutException
        at java.util.concurrent.FutureTask.get(FutureTask.java:205)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.getResult(ThreadPoolTest.java:96)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.getSubmitResult(ThreadPoolTest.java:72)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.poolTest(ThreadPoolTest.java:44)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.main(ThreadPoolTest.java:19)
    java.util.concurrent.TimeoutException
        at java.util.concurrent.FutureTask.get(FutureTask.java:205)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.getResult(ThreadPoolTest.java:96)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.getSubmitResult(ThreadPoolTest.java:72)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.poolTest(ThreadPoolTest.java:44)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.main(ThreadPoolTest.java:19)
    java.util.concurrent.TimeoutException
        at java.util.concurrent.FutureTask.get(FutureTask.java:205)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.getResult(ThreadPoolTest.java:96)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.getSubmitResult(ThreadPoolTest.java:72)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.poolTest(ThreadPoolTest.java:44)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.main(ThreadPoolTest.java:19)
    java.util.concurrent.TimeoutException
        at java.util.concurrent.FutureTask.get(FutureTask.java:205)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.getResult(ThreadPoolTest.java:96)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.getSubmitResult(ThreadPoolTest.java:72)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.poolTest(ThreadPoolTest.java:44)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.main(ThreadPoolTest.java:19)
    java.util.concurrent.TimeoutException
        at java.util.concurrent.FutureTask.get(FutureTask.java:205)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.getResult(ThreadPoolTest.java:96)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.getSubmitResult(ThreadPoolTest.java:72)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.poolTest(ThreadPoolTest.java:44)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.main(ThreadPoolTest.java:19)
    java.util.concurrent.TimeoutException
        at java.util.concurrent.FutureTask.get(FutureTask.java:205)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.getResult(ThreadPoolTest.java:96)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.getSubmitResult(ThreadPoolTest.java:72)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.poolTest(ThreadPoolTest.java:44)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.main(ThreadPoolTest.java:19)
    java.util.concurrent.TimeoutException
        at java.util.concurrent.FutureTask.get(FutureTask.java:205)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.getResult(ThreadPoolTest.java:96)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.getSubmitResult(ThreadPoolTest.java:72)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.poolTest(ThreadPoolTest.java:44)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.main(ThreadPoolTest.java:19)
    java.util.concurrent.TimeoutException
        at java.util.concurrent.FutureTask.get(FutureTask.java:205)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.getResult(ThreadPoolTest.java:96)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.getSubmitResult(ThreadPoolTest.java:72)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.poolTest(ThreadPoolTest.java:44)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.main(ThreadPoolTest.java:19)
    java.util.concurrent.TimeoutException
        at java.util.concurrent.FutureTask.get(FutureTask.java:205)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.getResult(ThreadPoolTest.java:96)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.getSubmitResult(ThreadPoolTest.java:72)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.poolTest(ThreadPoolTest.java:44)
        at cn.migu.newportal.cache.async.pool.conner.ThreadPoolTest.main(ThreadPoolTest.java:19)
    第0个线程请求超时了
    第1个线程请求超时了
    第2个线程请求超时了
    第3个线程请求超时了
    第4个线程请求超时了
    第5个线程请求超时了
    第6个线程:
    第(0)次请求数据,线程名:pool-1-thread-7,响应时间点:1536029991602
    第(1)次请求数据,线程名:pool-1-thread-7,响应时间点:1536029996604
    第(2)次请求数据,线程名:pool-1-thread-7,响应时间点:1536030001605
    第(3)次请求数据,线程名:pool-1-thread-7,响应时间点:1536030006606
    
    第7个线程:
    第(0)次请求数据,线程名:pool-1-thread-8,响应时间点:1536029991602
    第(1)次请求数据,线程名:pool-1-thread-8,响应时间点:1536029996604
    第(2)次请求数据,线程名:pool-1-thread-8,响应时间点:1536030001605
    第(3)次请求数据,线程名:pool-1-thread-8,响应时间点:1536030006606
    
    第8个线程:
    第(0)次请求数据,线程名:pool-1-thread-9,响应时间点:1536029991603
    第(1)次请求数据,线程名:pool-1-thread-9,响应时间点:1536029996604
    第(2)次请求数据,线程名:pool-1-thread-9,响应时间点:1536030001604
    第(3)次请求数据,线程名:pool-1-thread-9,响应时间点:1536030006605
    
    第9个线程:
    第(0)次请求数据,线程名:pool-1-thread-10,响应时间点:1536029991603
    第(1)次请求数据,线程名:pool-1-thread-10,响应时间点:1536029996604
    第(2)次请求数据,线程名:pool-1-thread-10,响应时间点:1536030001604
    第(3)次请求数据,线程名:pool-1-thread-10,响应时间点:1536030006605
    
    第10个线程:
    第(0)次请求数据,线程名:pool-1-thread-11,响应时间点:1536029991603
    第(1)次请求数据,线程名:pool-1-thread-11,响应时间点:1536029996604
    第(2)次请求数据,线程名:pool-1-thread-11,响应时间点:1536030001604
    第(3)次请求数据,线程名:pool-1-thread-11,响应时间点:1536030006605
    
    第11个线程:
    第(0)次请求数据,线程名:pool-1-thread-12,响应时间点:1536029991603
    第(1)次请求数据,线程名:pool-1-thread-12,响应时间点:1536029996605
    第(2)次请求数据,线程名:pool-1-thread-12,响应时间点:1536030001605
    第(3)次请求数据,线程名:pool-1-thread-12,响应时间点:1536030006606
    
    第12个线程:
    第(0)次请求数据,线程名:pool-1-thread-13,响应时间点:1536029991603
    第(1)次请求数据,线程名:pool-1-thread-13,响应时间点:1536029996605
    第(2)次请求数据,线程名:pool-1-thread-13,响应时间点:1536030001605
    第(3)次请求数据,线程名:pool-1-thread-13,响应时间点:1536030006606
    
    第13个线程:
    第(0)次请求数据,线程名:pool-1-thread-14,响应时间点:1536029991604
    第(1)次请求数据,线程名:pool-1-thread-14,响应时间点:1536029996605
    第(2)次请求数据,线程名:pool-1-thread-14,响应时间点:1536030001605
    第(3)次请求数据,线程名:pool-1-thread-14,响应时间点:1536030006606
    
    第14个线程:
    第(0)次请求数据,线程名:pool-1-thread-15,响应时间点:1536029991604
    第(1)次请求数据,线程名:pool-1-thread-15,响应时间点:1536029996605
    第(2)次请求数据,线程名:pool-1-thread-15,响应时间点:1536030001605
    第(3)次请求数据,线程名:pool-1-thread-15,响应时间点:1536030006606
    
    第15个线程:
    第(0)次请求数据,线程名:pool-1-thread-16,响应时间点:1536029991604
    第(1)次请求数据,线程名:pool-1-thread-16,响应时间点:1536029996606
    第(2)次请求数据,线程名:pool-1-thread-16,响应时间点:1536030001607
    第(3)次请求数据,线程名:pool-1-thread-16,响应时间点:1536030006609
    
    第16个线程:
    第(0)次请求数据,线程名:pool-1-thread-17,响应时间点:1536029991604
    第(1)次请求数据,线程名:pool-1-thread-17,响应时间点:1536029996606
    第(2)次请求数据,线程名:pool-1-thread-17,响应时间点:1536030001607
    第(3)次请求数据,线程名:pool-1-thread-17,响应时间点:1536030006609
    
    第17个线程:
    第(0)次请求数据,线程名:pool-1-thread-18,响应时间点:1536029991605
    第(1)次请求数据,线程名:pool-1-thread-18,响应时间点:1536029996607
    第(2)次请求数据,线程名:pool-1-thread-18,响应时间点:1536030001607
    第(3)次请求数据,线程名:pool-1-thread-18,响应时间点:1536030006608
    
    第18个线程:
    第(0)次请求数据,线程名:pool-1-thread-19,响应时间点:1536029991609
    第(1)次请求数据,线程名:pool-1-thread-19,响应时间点:1536029996610
    第(2)次请求数据,线程名:pool-1-thread-19,响应时间点:1536030001610
    第(3)次请求数据,线程名:pool-1-thread-19,响应时间点:1536030006612
    
    第19个线程:
    第(0)次请求数据,线程名:pool-1-thread-20,响应时间点:1536029991609
    第(1)次请求数据,线程名:pool-1-thread-20,响应时间点:1536029996610
    第(2)次请求数据,线程名:pool-1-thread-20,响应时间点:1536030001611
    第(3)次请求数据,线程名:pool-1-thread-20,响应时间点:1536030006612
    
    第20个线程:
    第(0)次请求数据,线程名:pool-1-thread-21,响应时间点:1536029991608
    第(1)次请求数据,线程名:pool-1-thread-21,响应时间点:1536029996610
    第(2)次请求数据,线程名:pool-1-thread-21,响应时间点:1536030001612
    第(3)次请求数据,线程名:pool-1-thread-21,响应时间点:1536030006614
    
    第21个线程:
    第(0)次请求数据,线程名:pool-1-thread-22,响应时间点:1536029991608
    第(1)次请求数据,线程名:pool-1-thread-22,响应时间点:1536029996610
    第(2)次请求数据,线程名:pool-1-thread-22,响应时间点:1536030001610
    第(3)次请求数据,线程名:pool-1-thread-22,响应时间点:1536030006611
    
    第22个线程:
    第(0)次请求数据,线程名:pool-1-thread-23,响应时间点:1536029991608
    第(1)次请求数据,线程名:pool-1-thread-23,响应时间点:1536029996610
    第(2)次请求数据,线程名:pool-1-thread-23,响应时间点:1536030001611
    第(3)次请求数据,线程名:pool-1-thread-23,响应时间点:1536030006612
    
    第23个线程:
    第(0)次请求数据,线程名:pool-1-thread-24,响应时间点:1536029991608
    第(1)次请求数据,线程名:pool-1-thread-24,响应时间点:1536029996609
    第(2)次请求数据,线程名:pool-1-thread-24,响应时间点:1536030001609
    第(3)次请求数据,线程名:pool-1-thread-24,响应时间点:1536030006610
    
    第24个线程:
    第(0)次请求数据,线程名:pool-1-thread-25,响应时间点:1536029991608
    第(1)次请求数据,线程名:pool-1-thread-25,响应时间点:1536029996609
    第(2)次请求数据,线程名:pool-1-thread-25,响应时间点:1536030001609
    第(3)次请求数据,线程名:pool-1-thread-25,响应时间点:1536030006610
    
    第25个线程:
    第(0)次请求数据,线程名:pool-1-thread-26,响应时间点:1536029991608
    第(1)次请求数据,线程名:pool-1-thread-26,响应时间点:1536029996609
    第(2)次请求数据,线程名:pool-1-thread-26,响应时间点:1536030001609
    第(3)次请求数据,线程名:pool-1-thread-26,响应时间点:1536030006610
    
    第26个线程:
    第(0)次请求数据,线程名:pool-1-thread-27,响应时间点:1536029991607
    第(1)次请求数据,线程名:pool-1-thread-27,响应时间点:1536029996609
    第(2)次请求数据,线程名:pool-1-thread-27,响应时间点:1536030001611
    第(3)次请求数据,线程名:pool-1-thread-27,响应时间点:1536030006613
    
    第27个线程:
    第(0)次请求数据,线程名:pool-1-thread-28,响应时间点:1536029991608
    第(1)次请求数据,线程名:pool-1-thread-28,响应时间点:1536029996609
    第(2)次请求数据,线程名:pool-1-thread-28,响应时间点:1536030001609
    第(3)次请求数据,线程名:pool-1-thread-28,响应时间点:1536030006610
    
    第28个线程:
    第(0)次请求数据,线程名:pool-1-thread-29,响应时间点:1536029991608
    第(1)次请求数据,线程名:pool-1-thread-29,响应时间点:1536029996609
    第(2)次请求数据,线程名:pool-1-thread-29,响应时间点:1536030001609
    第(3)次请求数据,线程名:pool-1-thread-29,响应时间点:1536030006610
    
    第29个线程:
    第(0)次请求数据,线程名:pool-1-thread-30,响应时间点:1536029991607
    第(1)次请求数据,线程名:pool-1-thread-30,响应时间点:1536029996609
    第(2)次请求数据,线程名:pool-1-thread-30,响应时间点:1536030001611
    第(3)次请求数据,线程名:pool-1-thread-30,响应时间点:1536030006612
    
    第30个线程:
    第(0)次请求数据,线程名:pool-1-thread-31,响应时间点:1536029991607
    第(1)次请求数据,线程名:pool-1-thread-31,响应时间点:1536029996608
    第(2)次请求数据,线程名:pool-1-thread-31,响应时间点:1536030001610
    第(3)次请求数据,线程名:pool-1-thread-31,响应时间点:1536030006611
    
    第31个线程:
    第(0)次请求数据,线程名:pool-1-thread-32,响应时间点:1536029991607
    第(1)次请求数据,线程名:pool-1-thread-32,响应时间点:1536029996608
    第(2)次请求数据,线程名:pool-1-thread-32,响应时间点:1536030001609
    第(3)次请求数据,线程名:pool-1-thread-32,响应时间点:1536030006611
    
    第32个线程:
    第(0)次请求数据,线程名:pool-1-thread-33,响应时间点:1536029991607
    第(1)次请求数据,线程名:pool-1-thread-33,响应时间点:1536029996608
    第(2)次请求数据,线程名:pool-1-thread-33,响应时间点:1536030001610
    第(3)次请求数据,线程名:pool-1-thread-33,响应时间点:1536030006611
    
    第33个线程:
    第(0)次请求数据,线程名:pool-1-thread-34,响应时间点:1536029991606
    第(1)次请求数据,线程名:pool-1-thread-34,响应时间点:1536029996608
    第(2)次请求数据,线程名:pool-1-thread-34,响应时间点:1536030001609
    第(3)次请求数据,线程名:pool-1-thread-34,响应时间点:1536030006611
    
    第34个线程:
    第(0)次请求数据,线程名:pool-1-thread-35,响应时间点:1536029991606
    第(1)次请求数据,线程名:pool-1-thread-35,响应时间点:1536029996608
    第(2)次请求数据,线程名:pool-1-thread-35,响应时间点:1536030001610
    第(3)次请求数据,线程名:pool-1-thread-35,响应时间点:1536030006611
    
    第35个线程:
    第(0)次请求数据,线程名:pool-1-thread-36,响应时间点:1536029991605
    第(1)次请求数据,线程名:pool-1-thread-36,响应时间点:1536029996607
    第(2)次请求数据,线程名:pool-1-thread-36,响应时间点:1536030001607
    第(3)次请求数据,线程名:pool-1-thread-36,响应时间点:1536030006608
    
    第36个线程:
    第(0)次请求数据,线程名:pool-1-thread-37,响应时间点:1536029991606
    第(1)次请求数据,线程名:pool-1-thread-37,响应时间点:1536029996607
    第(2)次请求数据,线程名:pool-1-thread-37,响应时间点:1536030001607
    第(3)次请求数据,线程名:pool-1-thread-37,响应时间点:1536030006608
    
    第37个线程:
    第(0)次请求数据,线程名:pool-1-thread-38,响应时间点:1536029991606
    第(1)次请求数据,线程名:pool-1-thread-38,响应时间点:1536029996607
    第(2)次请求数据,线程名:pool-1-thread-38,响应时间点:1536030001607
    第(3)次请求数据,线程名:pool-1-thread-38,响应时间点:1536030006608
    
    第38个线程:
    第(0)次请求数据,线程名:pool-1-thread-39,响应时间点:1536029991605
    第(1)次请求数据,线程名:pool-1-thread-39,响应时间点:1536029996606
    第(2)次请求数据,线程名:pool-1-thread-39,响应时间点:1536030001608
    第(3)次请求数据,线程名:pool-1-thread-39,响应时间点:1536030006609
    
    第39个线程:
    第(0)次请求数据,线程名:pool-1-thread-40,响应时间点:1536029991605
    第(1)次请求数据,线程名:pool-1-thread-40,响应时间点:1536029996606
    第(2)次请求数据,线程名:pool-1-thread-40,响应时间点:1536030001607
    第(3)次请求数据,线程名:pool-1-thread-40,响应时间点:1536030006608
    
    第40个线程:
    第(0)次请求数据,线程名:pool-1-thread-41,响应时间点:1536029991610
    第(1)次请求数据,线程名:pool-1-thread-41,响应时间点:1536029996611
    第(2)次请求数据,线程名:pool-1-thread-41,响应时间点:1536030001612
    第(3)次请求数据,线程名:pool-1-thread-41,响应时间点:1536030006613
    
    第41个线程:
    第(0)次请求数据,线程名:pool-1-thread-42,响应时间点:1536029991610
    第(1)次请求数据,线程名:pool-1-thread-42,响应时间点:1536029996611
    第(2)次请求数据,线程名:pool-1-thread-42,响应时间点:1536030001611
    第(3)次请求数据,线程名:pool-1-thread-42,响应时间点:1536030006613
    
    第42个线程:
    第(0)次请求数据,线程名:pool-1-thread-43,响应时间点:1536029991609
    第(1)次请求数据,线程名:pool-1-thread-43,响应时间点:1536029996610
    第(2)次请求数据,线程名:pool-1-thread-43,响应时间点:1536030001611
    第(3)次请求数据,线程名:pool-1-thread-43,响应时间点:1536030006612
    
    第43个线程:
    第(0)次请求数据,线程名:pool-1-thread-44,响应时间点:1536029991610
    第(1)次请求数据,线程名:pool-1-thread-44,响应时间点:1536029996611
    第(2)次请求数据,线程名:pool-1-thread-44,响应时间点:1536030001612
    第(3)次请求数据,线程名:pool-1-thread-44,响应时间点:1536030006613
    
    第44个线程:
    第(0)次请求数据,线程名:pool-1-thread-45,响应时间点:1536029991609
    第(1)次请求数据,线程名:pool-1-thread-45,响应时间点:1536029996611
    第(2)次请求数据,线程名:pool-1-thread-45,响应时间点:1536030001612
    第(3)次请求数据,线程名:pool-1-thread-45,响应时间点:1536030006613
    
    第45个线程:
    第(0)次请求数据,线程名:pool-1-thread-46,响应时间点:1536029991609
    第(1)次请求数据,线程名:pool-1-thread-46,响应时间点:1536029996610
    第(2)次请求数据,线程名:pool-1-thread-46,响应时间点:1536030001611
    第(3)次请求数据,线程名:pool-1-thread-46,响应时间点:1536030006612
    
    第46个线程:
    第(0)次请求数据,线程名:pool-1-thread-47,响应时间点:1536029991609
    第(1)次请求数据,线程名:pool-1-thread-47,响应时间点:1536029996610
    第(2)次请求数据,线程名:pool-1-thread-47,响应时间点:1536030001611
    第(3)次请求数据,线程名:pool-1-thread-47,响应时间点:1536030006612
    
    第47个线程:
    第(0)次请求数据,线程名:pool-1-thread-48,响应时间点:1536029991610
    第(1)次请求数据,线程名:pool-1-thread-48,响应时间点:1536029996611
    第(2)次请求数据,线程名:pool-1-thread-48,响应时间点:1536030001612
    第(3)次请求数据,线程名:pool-1-thread-48,响应时间点:1536030006613
    
    第48个线程:
    第(0)次请求数据,线程名:pool-1-thread-49,响应时间点:1536029991611
    第(1)次请求数据,线程名:pool-1-thread-49,响应时间点:1536029996613
    第(2)次请求数据,线程名:pool-1-thread-49,响应时间点:1536030001616
    第(3)次请求数据,线程名:pool-1-thread-49,响应时间点:1536030006617
    
    第49个线程:
    第(0)次请求数据,线程名:pool-1-thread-50,响应时间点:1536029991611
    第(1)次请求数据,线程名:pool-1-thread-50,响应时间点:1536029996613
    第(2)次请求数据,线程名:pool-1-thread-50,响应时间点:1536030001617
    第(3)次请求数据,线程名:pool-1-thread-50,响应时间点:1536030006617
    
    第50个线程:
    第(0)次请求数据,线程名:pool-1-thread-51,响应时间点:1536029991611
    第(1)次请求数据,线程名:pool-1-thread-51,响应时间点:1536029996613
    第(2)次请求数据,线程名:pool-1-thread-51,响应时间点:1536030001617
    第(3)次请求数据,线程名:pool-1-thread-51,响应时间点:1536030006617
    
    第51个线程:
    第(0)次请求数据,线程名:pool-1-thread-52,响应时间点:1536029991611
    第(1)次请求数据,线程名:pool-1-thread-52,响应时间点:1536029996612
    第(2)次请求数据,线程名:pool-1-thread-52,响应时间点:1536030001613
    第(3)次请求数据,线程名:pool-1-thread-52,响应时间点:1536030006614
    
    第52个线程:
    第(0)次请求数据,线程名:pool-1-thread-53,响应时间点:1536029991611
    第(1)次请求数据,线程名:pool-1-thread-53,响应时间点:1536029996612
    第(2)次请求数据,线程名:pool-1-thread-53,响应时间点:1536030001614
    第(3)次请求数据,线程名:pool-1-thread-53,响应时间点:1536030006616
    
    第53个线程:
    第(0)次请求数据,线程名:pool-1-thread-54,响应时间点:1536029991611
    第(1)次请求数据,线程名:pool-1-thread-54,响应时间点:1536029996612
    第(2)次请求数据,线程名:pool-1-thread-54,响应时间点:1536030001614
    第(3)次请求数据,线程名:pool-1-thread-54,响应时间点:1536030006615
    
    第54个线程:
    第(0)次请求数据,线程名:pool-1-thread-55,响应时间点:1536029991610
    第(1)次请求数据,线程名:pool-1-thread-55,响应时间点:1536029996612
    第(2)次请求数据,线程名:pool-1-thread-55,响应时间点:1536030001613
    第(3)次请求数据,线程名:pool-1-thread-55,响应时间点:1536030006614
    
    第55个线程:
    第(0)次请求数据,线程名:pool-1-thread-56,响应时间点:1536029991610
    第(1)次请求数据,线程名:pool-1-thread-56,响应时间点:1536029996611
    第(2)次请求数据,线程名:pool-1-thread-56,响应时间点:1536030001612
    第(3)次请求数据,线程名:pool-1-thread-56,响应时间点:1536030006613
    
    第56个线程:
    第(0)次请求数据,线程名:pool-1-thread-57,响应时间点:1536029991610
    第(1)次请求数据,线程名:pool-1-thread-57,响应时间点:1536029996612
    第(2)次请求数据,线程名:pool-1-thread-57,响应时间点:1536030001613
    第(3)次请求数据,线程名:pool-1-thread-57,响应时间点:1536030006615
    
    第57个线程:
    第(0)次请求数据,线程名:pool-1-thread-58,响应时间点:1536029991610
    第(1)次请求数据,线程名:pool-1-thread-58,响应时间点:1536029996612
    第(2)次请求数据,线程名:pool-1-thread-58,响应时间点:1536030001613
    第(3)次请求数据,线程名:pool-1-thread-58,响应时间点:1536030006614
    
    第58个线程:
    第(0)次请求数据,线程名:pool-1-thread-59,响应时间点:1536029991612
    第(1)次请求数据,线程名:pool-1-thread-59,响应时间点:1536029996613
    第(2)次请求数据,线程名:pool-1-thread-59,响应时间点:1536030001616
    第(3)次请求数据,线程名:pool-1-thread-59,响应时间点:1536030006617
    
    第59个线程:
    第(0)次请求数据,线程名:pool-1-thread-60,响应时间点:1536029991612
    第(1)次请求数据,线程名:pool-1-thread-60,响应时间点:1536029996613
    第(2)次请求数据,线程名:pool-1-thread-60,响应时间点:1536030001616
    第(3)次请求数据,线程名:pool-1-thread-60,响应时间点:1536030006617
    
    第60个线程:
    第(0)次请求数据,线程名:pool-1-thread-61,响应时间点:1536029991612
    第(1)次请求数据,线程名:pool-1-thread-61,响应时间点:1536029996613
    第(2)次请求数据,线程名:pool-1-thread-61,响应时间点:1536030001616
    第(3)次请求数据,线程名:pool-1-thread-61,响应时间点:1536030006617
    
    第61个线程:
    第(0)次请求数据,线程名:pool-1-thread-62,响应时间点:1536029991612
    第(1)次请求数据,线程名:pool-1-thread-62,响应时间点:1536029996613
    第(2)次请求数据,线程名:pool-1-thread-62,响应时间点:1536030001615
    第(3)次请求数据,线程名:pool-1-thread-62,响应时间点:1536030006616
    
    第62个线程:
    第(0)次请求数据,线程名:pool-1-thread-63,响应时间点:1536029991612
    第(1)次请求数据,线程名:pool-1-thread-63,响应时间点:1536029996613
    第(2)次请求数据,线程名:pool-1-thread-63,响应时间点:1536030001615
    第(3)次请求数据,线程名:pool-1-thread-63,响应时间点:1536030006616
    
    第63个线程:
    第(0)次请求数据,线程名:pool-1-thread-64,响应时间点:1536029991612
    第(1)次请求数据,线程名:pool-1-thread-64,响应时间点:1536029996613
    第(2)次请求数据,线程名:pool-1-thread-64,响应时间点:1536030001614
    第(3)次请求数据,线程名:pool-1-thread-64,响应时间点:1536030006616
    
    第64个线程请求超时了
    第65个线程请求超时了
    第66个线程请求超时了
    第67个线程请求超时了
    第68个线程请求超时了
    第69个线程请求超时了
    第70个线程:
    第(0)次请求数据,线程名:pool-1-thread-2,响应时间点:1536030011606
    第(1)次请求数据,线程名:pool-1-thread-2,响应时间点:1536030016606
    第(2)次请求数据,线程名:pool-1-thread-2,响应时间点:1536030021607
    第(3)次请求数据,线程名:pool-1-thread-2,响应时间点:1536030026607
    
    第71个线程:
    第(0)次请求数据,线程名:pool-1-thread-11,响应时间点:1536030011606
    第(1)次请求数据,线程名:pool-1-thread-11,响应时间点:1536030016606
    第(2)次请求数据,线程名:pool-1-thread-11,响应时间点:1536030021607
    第(3)次请求数据,线程名:pool-1-thread-11,响应时间点:1536030026607
    
    第72个线程:
    第(0)次请求数据,线程名:pool-1-thread-14,响应时间点:1536030011607
    第(1)次请求数据,线程名:pool-1-thread-14,响应时间点:1536030016607
    第(2)次请求数据,线程名:pool-1-thread-14,响应时间点:1536030021609
    第(3)次请求数据,线程名:pool-1-thread-14,响应时间点:1536030026609
    
    第73个线程:
    第(0)次请求数据,线程名:pool-1-thread-12,响应时间点:1536030011607
    第(1)次请求数据,线程名:pool-1-thread-12,响应时间点:1536030016607
    第(2)次请求数据,线程名:pool-1-thread-12,响应时间点:1536030021608
    第(3)次请求数据,线程名:pool-1-thread-12,响应时间点:1536030026608
    
    第74个线程:
    第(0)次请求数据,线程名:pool-1-thread-7,响应时间点:1536030011607
    第(1)次请求数据,线程名:pool-1-thread-7,响应时间点:1536030016607
    第(2)次请求数据,线程名:pool-1-thread-7,响应时间点:1536030021608
    第(3)次请求数据,线程名:pool-1-thread-7,响应时间点:1536030026609
    
    第75个线程:
    第(0)次请求数据,线程名:pool-1-thread-8,响应时间点:1536030011607
    第(1)次请求数据,线程名:pool-1-thread-8,响应时间点:1536030016607
    第(2)次请求数据,线程名:pool-1-thread-8,响应时间点:1536030021609
    第(3)次请求数据,线程名:pool-1-thread-8,响应时间点:1536030026609
    
    第76个线程:
    第(0)次请求数据,线程名:pool-1-thread-15,响应时间点:1536030011607
    第(1)次请求数据,线程名:pool-1-thread-15,响应时间点:1536030016607
    第(2)次请求数据,线程名:pool-1-thread-15,响应时间点:1536030021608
    第(3)次请求数据,线程名:pool-1-thread-15,响应时间点:1536030026609
    
    第77个线程:
    第(0)次请求数据,线程名:pool-1-thread-13,响应时间点:1536030011607
    第(1)次请求数据,线程名:pool-1-thread-13,响应时间点:1536030016607
    第(2)次请求数据,线程名:pool-1-thread-13,响应时间点:1536030021609
    第(3)次请求数据,线程名:pool-1-thread-13,响应时间点:1536030026609
    
    第78个线程:
    第(0)次请求数据,线程名:pool-1-thread-36,响应时间点:1536030011609
    第(1)次请求数据,线程名:pool-1-thread-36,响应时间点:1536030016609
    第(2)次请求数据,线程名:pool-1-thread-36,响应时间点:1536030021610
    第(3)次请求数据,线程名:pool-1-thread-36,响应时间点:1536030026610
    
    第79个线程:
    第(0)次请求数据,线程名:pool-1-thread-40,响应时间点:1536030011609
    第(1)次请求数据,线程名:pool-1-thread-40,响应时间点:1536030016609
    第(2)次请求数据,线程名:pool-1-thread-40,响应时间点:1536030021610
    第(3)次请求数据,线程名:pool-1-thread-40,响应时间点:1536030026610
    
    第80个线程:
    第(0)次请求数据,线程名:pool-1-thread-38,响应时间点:1536030011609
    第(1)次请求数据,线程名:pool-1-thread-38,响应时间点:1536030016609
    第(2)次请求数据,线程名:pool-1-thread-38,响应时间点:1536030021610
    第(3)次请求数据,线程名:pool-1-thread-38,响应时间点:1536030026610
    
    第81个线程:
    第(0)次请求数据,线程名:pool-1-thread-37,响应时间点:1536030011609
    第(1)次请求数据,线程名:pool-1-thread-37,响应时间点:1536030016609
    第(2)次请求数据,线程名:pool-1-thread-37,响应时间点:1536030021610
    第(3)次请求数据,线程名:pool-1-thread-37,响应时间点:1536030026610
    
    第82个线程:
    第(0)次请求数据,线程名:pool-1-thread-18,响应时间点:1536030011609
    第(1)次请求数据,线程名:pool-1-thread-18,响应时间点:1536030016609
    第(2)次请求数据,线程名:pool-1-thread-18,响应时间点:1536030021610
    第(3)次请求数据,线程名:pool-1-thread-18,响应时间点:1536030026610
    
    第83个线程:
    第(0)次请求数据,线程名:pool-1-thread-17,响应时间点:1536030011610
    第(1)次请求数据,线程名:pool-1-thread-17,响应时间点:1536030016610
    第(2)次请求数据,线程名:pool-1-thread-17,响应时间点:1536030021611
    第(3)次请求数据,线程名:pool-1-thread-17,响应时间点:1536030026611
    
    第84个线程:
    第(0)次请求数据,线程名:pool-1-thread-16,响应时间点:1536030011610
    第(1)次请求数据,线程名:pool-1-thread-16,响应时间点:1536030016610
    第(2)次请求数据,线程名:pool-1-thread-16,响应时间点:1536030021611
    第(3)次请求数据,线程名:pool-1-thread-16,响应时间点:1536030026611
    
    第85个线程:
    第(0)次请求数据,线程名:pool-1-thread-39,响应时间点:1536030011610
    第(1)次请求数据,线程名:pool-1-thread-39,响应时间点:1536030016610
    第(2)次请求数据,线程名:pool-1-thread-39,响应时间点:1536030021611
    第(3)次请求数据,线程名:pool-1-thread-39,响应时间点:1536030026611
    
    第86个线程:
    第(0)次请求数据,线程名:pool-1-thread-28,响应时间点:1536030011611
    第(1)次请求数据,线程名:pool-1-thread-28,响应时间点:1536030016611
    第(2)次请求数据,线程名:pool-1-thread-28,响应时间点:1536030021612
    第(3)次请求数据,线程名:pool-1-thread-28,响应时间点:1536030026612
    
    第87个线程:
    第(0)次请求数据,线程名:pool-1-thread-24,响应时间点:1536030011611
    第(1)次请求数据,线程名:pool-1-thread-24,响应时间点:1536030016611
    第(2)次请求数据,线程名:pool-1-thread-24,响应时间点:1536030021612
    第(3)次请求数据,线程名:pool-1-thread-24,响应时间点:1536030026612
    
    第88个线程:
    第(0)次请求数据,线程名:pool-1-thread-26,响应时间点:1536030011611
    第(1)次请求数据,线程名:pool-1-thread-26,响应时间点:1536030016611
    第(2)次请求数据,线程名:pool-1-thread-26,响应时间点:1536030021612
    第(3)次请求数据,线程名:pool-1-thread-26,响应时间点:1536030026612
    
    第89个线程:
    第(0)次请求数据,线程名:pool-1-thread-25,响应时间点:1536030011611
    第(1)次请求数据,线程名:pool-1-thread-25,响应时间点:1536030016611
    第(2)次请求数据,线程名:pool-1-thread-25,响应时间点:1536030021612
    第(3)次请求数据,线程名:pool-1-thread-25,响应时间点:1536030026612
    
    第90个线程:
    第(0)次请求数据,线程名:pool-1-thread-29,响应时间点:1536030011611
    第(1)次请求数据,线程名:pool-1-thread-29,响应时间点:1536030016611
    第(2)次请求数据,线程名:pool-1-thread-29,响应时间点:1536030021612
    第(3)次请求数据,线程名:pool-1-thread-29,响应时间点:1536030026612
    
    第91个线程:
    第(0)次请求数据,线程名:pool-1-thread-3,响应时间点:1536030011611
    第(1)次请求数据,线程名:pool-1-thread-3,响应时间点:1536030016611
    第(2)次请求数据,线程名:pool-1-thread-3,响应时间点:1536030021612
    第(3)次请求数据,线程名:pool-1-thread-3,响应时间点:1536030026612
    
    第92个线程:
    第(0)次请求数据,线程名:pool-1-thread-33,响应时间点:1536030011612
    第(1)次请求数据,线程名:pool-1-thread-33,响应时间点:1536030016612
    第(2)次请求数据,线程名:pool-1-thread-33,响应时间点:1536030021613
    第(3)次请求数据,线程名:pool-1-thread-33,响应时间点:1536030026613
    
    第93个线程:
    第(0)次请求数据,线程名:pool-1-thread-22,响应时间点:1536030011612
    第(1)次请求数据,线程名:pool-1-thread-22,响应时间点:1536030016612
    第(2)次请求数据,线程名:pool-1-thread-22,响应时间点:1536030021613
    第(3)次请求数据,线程名:pool-1-thread-22,响应时间点:1536030026613
    
    第94个线程:
    第(0)次请求数据,线程名:pool-1-thread-31,响应时间点:1536030011612
    第(1)次请求数据,线程名:pool-1-thread-31,响应时间点:1536030016612
    第(2)次请求数据,线程名:pool-1-thread-31,响应时间点:1536030021613
    第(3)次请求数据,线程名:pool-1-thread-31,响应时间点:1536030026613
    
    第95个线程:
    第(0)次请求数据,线程名:pool-1-thread-32,响应时间点:1536030011612
    第(1)次请求数据,线程名:pool-1-thread-32,响应时间点:1536030016612
    第(2)次请求数据,线程名:pool-1-thread-32,响应时间点:1536030021613
    第(3)次请求数据,线程名:pool-1-thread-32,响应时间点:1536030026613
    
    第96个线程:
    第(0)次请求数据,线程名:pool-1-thread-35,响应时间点:1536030011612
    第(1)次请求数据,线程名:pool-1-thread-35,响应时间点:1536030016612
    第(2)次请求数据,线程名:pool-1-thread-35,响应时间点:1536030021613
    第(3)次请求数据,线程名:pool-1-thread-35,响应时间点:1536030026613
    
    第97个线程:
    第(0)次请求数据,线程名:pool-1-thread-34,响应时间点:1536030011612
    第(1)次请求数据,线程名:pool-1-thread-34,响应时间点:1536030016612
    第(2)次请求数据,线程名:pool-1-thread-34,响应时间点:1536030021613
    第(3)次请求数据,线程名:pool-1-thread-34,响应时间点:1536030026613
    
    第98个线程:
    第(0)次请求数据,线程名:pool-1-thread-30,响应时间点:1536030011613
    第(1)次请求数据,线程名:pool-1-thread-30,响应时间点:1536030016613
    第(2)次请求数据,线程名:pool-1-thread-30,响应时间点:1536030021614
    第(3)次请求数据,线程名:pool-1-thread-30,响应时间点:1536030026614
    
    第99个线程:
    第(0)次请求数据,线程名:pool-1-thread-47,响应时间点:1536030011613
    第(1)次请求数据,线程名:pool-1-thread-47,响应时间点:1536030016613
    第(2)次请求数据,线程名:pool-1-thread-47,响应时间点:1536030021614
    第(3)次请求数据,线程名:pool-1-thread-47,响应时间点:1536030026614

      我们把池子大小固定为64(基本大小、最大大小均为64),然后丢进去100个请求线程,超出的36个会先放到一个无界队列中,等池中看有哪个线程已经服务完老请求了再出来接新客户。另外我们故意把服务时间加长了(每次数据请求休眠5秒),这会导致有部分线程在获取结果超时。关于超时需要注意的是,所设置的3秒超时针对的是获取结果等待的时间,跟每个线程执行的时延是两码事。仔细看一下上面的输出,池子中线程名打印出来的其实还没到64个,也就是重复利用的线程并未全部出场,超时的有12个。当我丢一万个请求线程时,会发生什么?

      这一行改为:

    t.poolTest(10000, 4, 1);

      每个任务的服务时间从5秒缩减到1秒,增加了池中线程的处理速度,但请求达到率暴增到10000,虽然无界队列可以容得下那9936个人客户,但64个服务生已经忙不过来了,现在控制台只有无尽的TimeOut异常了。为了能看到过程,我们把控制台的日志记录到文件里,在poolTest最后加入:

            // 打印到文件里
            try
            {
                PrintStream ps = new PrintStream("D:\ThreadPoolTest.txt");
                System.setOut(ps);   
            }
            catch (FileNotFoundException e)
            {
                e.printStackTrace();
            }   
            System.out.println(result);

      现在控制台依然是无尽的TimeOut异常,但我们去看ThreadPoolTest.txt,会发现服务线程还是有服务的。我的文件里超时是157个,占比也不算多。但如果我再把响应时间提高到2秒呢?超时314个。如果放到生产环境,很明显,池子还是得爆,因为请求不是一万个就完事了,而是源源不断的累加而来。还是那句话,只要请求到达率超过池的处理速度,迟早要出事。

  • 相关阅读:
    LINQPad_批量修改图片名称
    1.2_php验证码
    1.1_php基础语法
    移动管理后台
    [Swift]LeetCode1137. 第 N 个泰波那契数 | N-th Tribonacci Number
    [Swift]LeetCode1136. 平行课程 | Parallel Courses
    [Swift]LeetCode1135. 最低成本联通所有城市 | Connecting Cities With Minimum Cost
    [Swift]LeetCode1134. 阿姆斯特朗数 | Armstrong Number
    [Swift]LeetCode1133. 最大唯一数 | Largest Unique Number
    企业
  • 原文地址:https://www.cnblogs.com/wuxun1997/p/9582290.html
Copyright © 2020-2023  润新知