前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >线程池问题探究

线程池问题探究

作者头像
付威
发布2023-10-17 15:28:06
900
发布2023-10-17 15:28:06
举报
发现问题

代码语言:javascript
复制
    Semaphore semaphore = new Semaphore(nThread);//定义几个许可
//这里
    ExecutorService executorService =new ThreadPoolExecutor(1, nThread,
            1000L, TimeUnit.MILLISECONDS,
            new ArrayBlockingQueue<>(1));//创建一个固定的线程池
    for (T obj : list) {
        try {
            semaphore.acquire();
            executorService.execute(() -> {
                try {
                    func.accept(obj);
                } catch (Exception ex) {
                    Logger.error("startWithMultiThread 出错!"+ex.getMessage());
                } finally {
                    semaphore.release();
                }
            });
        } catch (InterruptedException e) {
            Logger.error("startWithMultiThread 出错!"+e.getMessage());
        }
    }
    

public static void main(String[] args) {
    ArrayList<Object> objects = Lists.newArrayList();
    for (int i = 0; i < 1000; i++) {
        objects.add(i);
    }
    startWithMultiThread(objects,5, obj -> {
        Threads.sleep(1000);
        System.out.println(obj);
    });
}

在执行上面的代码的时候,出现了 reject 的异常,按道理说有semaphore.acquire(); 拦截,不应该会出现 reject 的异常。

但是如果把 keepAliveTime 时间改成 0 ,就可以正常执行。

分析原因
代码语言:javascript
复制
new ThreadPoolExecutor(1, nThread,1000L, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<>(1));
new ThreadPoolExecutor(1, nThread,0, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<>(1));
new ThreadPoolExecutor(nThread, nThread,0, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<>(1));
new ThreadPoolExecutor(nThread, nThread,1000, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<>(1));

对于上面的 4 种创建线程池的方法:

第一种和第二种的不同只是 keeplive 的事件不一样,在运行的时候运行的线程会大于核心线程数的,这样就在线程池的逻辑中会自动采用非核心线程超时策略,

在拉取的队列的任务时,采用的的 poll(n)的方式,如果 n>0是,线程池满了再次分配任务的时候会导致执行拒绝策略。poll(0),不会阻塞,可以正常分配。

如果采用第三种和第四种方式,则不会开启空闲线程超时释放策略,在拉取的任务的时候后采用了的 take()方法,一直阻塞,直到新的数据过来(从入队列到出队列,也会出现延迟),这样也会导致线程池执行拒绝策略。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-08-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 发现问题
  • 分析原因
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档