Tomcat服务器(Web容器),实际是一个应用程序,即进程。其由两部分组成:Container、Connector

Connector组成为:

image.png

  • LimitLatch用来限流,可以控制最大连接个数,一个浏览器访问服务器则会建立一条socket连接,LimitLatch用来保证服务器连接数不会过多;
  • Acceptor是一个死循环线程(tomcat这一进程的线程),只负责【接收新的socket连接】;
  • Poller也是一个死循环线程,用来监听某一socket连接(即上图的socketchannel)是否有【可读的I/O事件】,即用来监听浏览器是否给服务器发送数据,如post请求发送表单数据等;
  • 一旦可读,即浏览器将信息发送给服务器,信息会被封装成一个Runnable任务对象(socketProcessor),提交给Executor线程池处理;
  • Executor线程池中的工作线程最终负责【处理浏览器请求】;

Tomcat内的Executor线程池继承自ThreadPoolExecutor,并简单扩展了ThreadPoolExecutor,实际上是重写了executor方法。

  • 对于ThreadPoolExecutor线程池。如果总线程数达到maximumPoolSize,且任务队列已满的情况下,再有新任务提交到线程池,线程池会执行拒绝策略,并抛出RejectedExecutionException异常;
  • Tomcat线程池扩展了ThreadPoolExecutor,当任务队列已满,不会立刻抛出RejectedExecutionException异常,而是再次尝试将任务放入任务队列中,如果此时仍失败,才会抛出RejectedExecutionException异常;

Tomcat源码为:

image.png

java异常:

复习一下java中的异常,异常的使用方法为:try-catch块。try块将代码保护起来,如果try内代码在执行过程中出现异常或主动抛出异常(throws),catch块会进行捕捉,当然前提是捕捉对应类型的异常。如果本try-catch无法处理/捕捉异常,则交由上层try-catch块处理。这里上层指的是调用本方法的位置。
注意throws为主动抛出异常,位置较为灵活。如果在try块中抛出异常,可优先交给catch块捕捉;如果在catch块中抛出异常,则交给上层捕捉异常。