首页 > 其他分享 >并发学习记录17:tomcat线程池

并发学习记录17:tomcat线程池

时间:2022-10-06 10:56:19浏览次数:59  
标签:RejectedExecutionException force 17 tomcat 任务 线程 timeout

tomcat在哪里用到了线程池

  • LimitLatch用来限流,可以控制最大连接个数
  • acceptor负责接收新的socket连接
  • poller负责监听socket channel是否有可读的IO事件
  • 一旦有可读的IO事件被监听到,就封装一个任务对象socketProcessor,提交给executor线程池处理
  • executor线程池中的工作线程最终负责处理请求

tomcat线程池扩展了ThreadPoolExecutor:
如果总线程达到了最大线程数,不会立刻抛出RejectedExecutionException异常,而是会再次尝试将任务放入队列,如果还是失败,才会抛出RejectedExecutionException异常。

tomcat-7.0.42部分源码

public void execute (Runnable command,long timeout, TimeUnit unit){
            submittedCount.incrementAndGet();
            try {
//              执行任务
                super.execute(command);
//              出现异常
            } catch (RejectedExecutionException rx) {
//              尝试将任务先放入队列,如果失败,才再次抛出异常
                if (super.getQueue() instanceof TaskQueue) {
                    final TaskQueue queue = (TaskQueue) super.getQueue();
                    try {
                        if (!queue.force(command, timeout, unit)) {
                            submittedCount.decrementAndGet();
                            throw new RejectedExecutionException("Queue capacity is full.");
                        }
                    } catch (InterruptedException x) {
                        submittedCount.decrementAndGet();
                        Thread.interrupted();
                        throw new RejectedExecutionException(x);
                    }
                } else {
                    submittedCount.decrementAndGet();
                    throw rx;
                }
            }
        }

TaskQueue的force方法:将任务放入等待队列

public boolean force(Runnable o, long timeout, TimeUnit unit) throws InterruptedException {
 if ( parent.isShutdown() ) 
 throw new RejectedExecutionException(
 "Executor not running, can't force a command into the queue"
 );
 return super.offer(o,timeout,unit); //forces the item onto the queue, to be used if the task 
is rejected
}

tomcat添加新任务的流程

如果提交的任务数 < 核心线程数,那么任务直接被提交到任务队列等待执行
如果提交的任务数 >= 核心线程数,且提交的任务数 < 最大线程数,那么也加入任务队列等待运行
如果提交的任务数 >= 最大线程数, 那么就创建救急线程运行任务

标签:RejectedExecutionException,force,17,tomcat,任务,线程,timeout
From: https://www.cnblogs.com/wbstudy/p/16757168.html

相关文章

  • JUC必要掌握(Synchronized,Lock,可重入锁ReentrantLock,可重入锁,读写锁,自旋锁,线程间通信,集
    本文已参与「新人创作礼」活动,一起开启掘金创作之路1.锁(Synchronized和lock)1.1Synchronized(1)Synchronized是Java内置的关键字,是Java内置的锁机制。(2)Synchronized的作......
  • 喜提JDK的BUG一枚!多线程的情况下请谨慎使用这个类的stream遍历。
    你好呀,我是歪歪。前段时间在RocketMQ的ISSUE里面冲浪的时候,看到一个pr,虽说是在RocketMQ的地盘上发现的,但是这个玩意吧,其实和RocketMQ没有任何关系。纯纯的就是......
  • 17_Java中的类作形参和返回值
    Java中的形参和返回值此处主要说明引用类型,总结下来就是在前面的规则下,做参数和返回值就看能否自己创建对象1、能就:传入本身对象,返回本身对象2、不能就:传入子类(......
  • 记一次 .NET 某工控数据采集平台 线程数 爆高分析
    一:背景1.讲故事前几天有位朋友在B站加到我,说他的程序出现了​​线程数​​爆高的问题,让我帮忙看一下怎么回事,截图如下:说来也奇怪,这些天碰到了好几起关于线程数无缘无故......
  • 记一次 .NET 某新能源系统 线程疯涨 分析
    一:背景1.讲故事前段时间收到一个朋友的求助,说他的程序线程数疯涨,寻求如何解决。等我分析完之后,我觉得这个问题很有代表性,所以拿出来和大家分享下,还是上老工具WinDbg。二:W......
  • 线程
    线程继承Thread类packagecom.teatea.demo01;//创建线程方程一:继承Threa类,重写run方法,调用start开启线程publicclassTestThread1extendsThread{@Override......
  • CF1739 部分题解
    比赛链接:https://codeforces.com/contest/1739AB水题//bySkyRainWind#include<cstdio>#include<vector>#include<cstring>#include<iostream>#include<algo......
  • 并发学习记录16:任务调度线程池
    在任务调度池功能加入之前,可以使用java.util.Timer来实现定时功能,Timer的优点在于简单易用,但由于所有任务都是由同一个线程来调度,因此所有任务都是串行执行的,同一时间只能......
  • CF1707B题解
    原题CF1707BDifferenceArray思路概述题意分析给定一个长度为\(n\)的序列\(\{a\}\)。每次执行以下操作对序列\(\{a\}\)进行差分,得到差分序列\(b_i=a_{i+1}-a......
  • Linux多线程服务端编程 pdf
    高清文字版下载链接:https://pan.baidu.com/s/1Ar0sbiycp70BdNysXfkg2w点击这里获取提取码 ......