java自定义线程池的踩坑

最近刚开始学习并发编程,使用线程池创建多线程,一开始跟着视频敲,老师正常运行,我一运行就直接报RejectedExecutionException,上网查询得知是线程池参数配置错误,但具体也不知道哪里错了。
在这里插入图片描述

  @GetMapping("demo")
    public CommonResult demo() throws InterruptedException {
        // 自定义线程池
        ExecutorService threadPool1 = new ThreadPoolExecutor(
                2,
                6,
                2L,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );
            for(int i = 1;i<=10;i++)
            {
                threadPool1.execute(()->{
                  System.out.println(Thread.currentThread().getName()+"办理业务");
                });
          }

       return new CommonResult(200,"success","");
    }

于是反复修改线程池参数,同时修改请求数量,发现把请求数量降低或者增大最大线程数可以解决问题,最后思考才恍然大悟:
自定义线程的最大请求数为最大线程数+阻塞队列容量,因此设置的参数只能满足8个请求,因此出现异常。
同时在解决问题的途中了解到:不建议这样使用线程池,线程池可以复用,而给每个请求单独创建线程池则是很大程度上的浪费
感慨:学之前就已经得知普遍不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 构造函数的方式,一个是容易产生OOM,另一个就是可以加深对线程池的理解。果然一写就产生问题,同时也是对线程池的工作流程理解更清晰。最后希望可以帮助到同样困惑的小伙伴

你可能感兴趣的:(Spring,Boot,java)