关于Request和Thread的关系一直有一个疑问,一般的理解就是对应每一个Request会有一个Thread来处理,问题是每一个Request是否对应的Thread是否一样,如果是一样,那么程序中在用到ThreadLocal的时候,Thread.currentThread岂不是相同,如果不一样,web 服务器是怎样做到保证用不同的Thread来处理不同的Request?
为了减少这种创建和销毁Thread的开销,一般的Web服务器在内部都有一个线程池来维护所创建的Thread,并有一个限定值控制线程池中Thread的总量。如果服务器所接受的Request数量超过线程池中Thread限制,就一部分Request处于等待状态,直到有空闲Thread才开始处理。
现在假设有一个类维护一个ThreadLocal的静态变量,每一次请求时候,都会调用ThreadLocal.get()/set() 操作, 大家都知道这些操作实际上是以Thread.currentThread为Key,取得一个对象的,问题的关键就在这里,如果每一个Request对应的Thread是一样,那么这个地方返回的对象就会是一样的,是否就混乱了呢?
现在有一个系统部署在WebLogic10下面,在第一次打开一个页面的时候,会有一个Thread被创建来处理该请求,再次打开其他页面时候,系统并不一定会创建一个新的Thread来处理,两次请求的Thread是相同的,再打开多个其他页面(超过10个),在这10多次的请求中,系统只会创建4个Thread来处理,那就是说这10多次的请求中,有一部分请求是使用相同的Thread来处理的。如果是这样的情况,上面的问题该如何解释呢?
我想Tomcat, Jboss在处理Request和Thread的时候和WebLogic应该大同小异,那么上面的问题该如何解释呢?
分享到:
相关推荐
在描述中提到的问题是,每个网络请求都需要添加`.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).onErrorReturn()`等通用处理。为了解决这个问题,我们可以创建一个工具类`RxNet`,提供一...
可以通过`Thread.currentThread()`或`Thread.getThreads()`来获取线程对象,再进一步查找request。 其次,实现半自动化的反射搜索。这一步涉及到遍历全局变量的所有属性,寻找包含"Request"关键字的对象,如`...
Responder是一个从Thread类派生出来的抽象类,它有一个抽象方法doService()必须在子类中重载,开发人员根据所要实现的server的需要在此方法中进行不同的处理。 最后,MonitorPool除了实现一个工作线程对上面所描述的...
总结来说,TCP服务器多线程是一种提升并发处理能力的技术,它通过为每个客户端连接创建单独的线程,实现了服务器对多个请求的同时处理。这种方式在处理大量并发连接时,能够有效地提高服务器的响应速度和系统的整体...
总结来说,"python-socket-with-thread-master_socket编程_sochet_"项目的核心是利用Python的`socket`和`threading`模块,构建一个能够处理多个并发连接的多线程服务器。这在处理大量并发请求时,如Web服务器、文件...
Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应...
每个拦截器都会处理请求,并将其传递给下一个拦截器,直到最后一个拦截器直接与服务器通信。响应则按照相反的顺序经过这些拦截器。 **3.4 拦截器类型** OkHttp 支持两种类型的拦截器: 1. **应用层拦截器**:通过...
这个控制器在编程中可以被抽象为一个类,包含各种状态变量和方法来处理不同的事件。 在Java中,我们可以创建一个名为`Elevator`的类,该类应包含以下属性: 1. `currentFloor`:表示电梯当前所在的楼层。 2. `...
在传统的 Web 容器中,处理请求的方式是为每个 request 分配一个 thread。这意味着 thread 的创建不是没有代价的,Web 容器的 thread pool 都是有上限的。那么一个很容易预见的问题就是,在高负载情况下,thread ...
运行完成后,可以通过“查看结果树”检查每个用户ID的请求是否正确执行,以及通过“聚合报告”来确认所有请求是否都已经成功发送。 #### 六、总结 通过使用JMeter中的CSV Data Set Config组件,我们可以轻松地实现...
定义一个全局错误处理方法,可以在此处根据错误类型进行不同的处理,如显示错误信息、重新登录、网络重连等。 ```java private void handleError(Throwable error) { if (error instanceof HttpException) { // ...
每个连接到服务器的客户端请求都会由一个新的线程处理,这样可以确保服务器能同时处理多个请求,提高服务效率。`ConnectionThread`类继承自`Thread`类,表示每个客户端连接都会创建一个这样的线程。通过`Socket`对象...
Servlet3.0是Java EE平台中的一个重要更新,它引入了许多新特性,其中一项重大改进就是对异步处理的支持。这项特性使得服务器可以处理长时间运行的任务,而不会阻塞其他请求,提高了系统的响应能力和效率。本实例...
这样,所有已连接的客户端套接字都集中在一个集合里,等待进一步处理。 业务处理线程则通过`select()`函数轮询这个套接字集合,`select()`可以监控多个文件描述符(在本例中是客户端套接字),等待数据到达。一旦有...
1. **版本控制**:GitHub是一个分布式版本控制系统,项目中每个提交都记录了代码的修改历史,便于团队协作和追踪问题。 2. **分支管理**:在开发过程中,开发者可能创建了多个分支进行新功能的开发或修复bug,然后...
每个客户端连接可以分配一个独立的线程,这样服务器可以同时处理多个请求。C++11引入了std::thread库,使得多线程编程变得更加方便。 6. **内存管理和错误处理**:在处理过程中,服务器必须有效地管理内存,避免...
并行则是指真正的同时进行多任务处理,这通常需要多核CPU来支持,每个核可以独立处理不同的任务,而不会相互干扰。 吞吐量是衡量系统性能的关键指标之一,通常用来衡量单位时间内服务器处理的请求数量,以request/...
在Android应用开发中,异常处理是一项至关重要的任务,它确保了程序在遇到错误时能够以优雅的方式退出,而不是崩溃,从而提高用户体验。本教程将详细讲解如何在Android中实现异常捕获并将其上传到服务器。 首先,...