代码之家  ›  专栏  ›  技术社区  ›  Elad Benda

Tomcat为每个HTTP请求分配一个新线程,那么使用future.get()的动机是什么?

  •  0
  • Elad Benda  · 技术社区  · 5 年前

    我知道tomcat服务器容器,为每个新的HTTP请求分配一个新线程,那么使用callable+future的动机是什么?

    1)为什么我们关心当前请求的唯一线程是否在执行长任务?

    2)如果主线程被future.get()阻塞了,那么仅仅让它做长时间的任务有什么好处?是关于tomcat识别线程是空闲的+被阻塞的-所以它知道不提升“超时”标志吗?

    3)使用while(future.isDone())比被future.get()阻塞有什么好处?在忙着等待的时候,这个线程不能做别的事情。

    0 回复  |  直到 5 年前
        1
  •  0
  •   user2023577    5 年前

    每个线程占用堆栈大小(预先分配,请参阅-Xss),太多线程可能会耗尽内存。最好将线程返回到servlet容器并使用ServletAPI3.1的异步功能。否则,在future.get()中挂起没有任何好处,除非运行此future任务的执行服务需要的并发线程数少于并发请求数。例如:800个servlet连接等待一个只有50个线程的SQL查询执行svc。它也可能是关于安全性/授权的,当只允许来自特定执行器svc的线程执行某些敏感调用(从具有特权的线程工厂创建的线程)时。