java - ThreadLocal 反模式的替代品?

标签 java multithreading design-patterns jboss

在一次工作 session 上。我听说Thread Local绝对是一种反模式,因为新的应用程序服务器使用称为新IO的新线程技术。事实上,他们告诉我ThreadLocal的问题是一个完整的线程必须等待数据库查询返回响应,这绝对是浪费资源(内存和CPU)。 新开发的线程策略使用线程池,因此当不再需要线程时,它将返回到池中。我听说这项新技术是在新的AS中实现的,例如我们的Jboss,Websphere......(我是没有把握)。 例如,我可以在本地使用 Apache tomcat 吗?(如果有关于这一事实的可能文档)

最佳答案

ThreadLocal 是故事中的配角。您听说过的是异步请求处理,NIO 库对此提供了帮助。

在这种编程范例中,您不会得到像这样的简单方法

Response processRequest(Request req)

相反,你会得到

void requestReceived(Request req, Response resp)

在这个方法中,您通常会通过准备后端请求并调用其方法来开始处理,如下所示

execute(Query q, ResultCallback cb)

框架将调用您的ResultCallback的方法resultReady(Result res),其中将包含查询结果。

这里的要点是,方法requestReceived立即返回,并且在后端处理后端请求时不会占用线程子系统。

顺便说一句,这种编程风格的另一个名称是连续传递风格或 CPS。这是因为当你调用一个函数时,你不会等待它的返回值,而是向其中传递一个回调函数,该回调函数将使用函数的结果进行调用,并且它实现了总的延续请求处理。

ThreadLocal 如何融入其中

如果您遵循了我上面所说的,您应该已经清楚,在这种请求处理方式中,ThreadLocal 是一个无用的概念,因为请求处理可以自由地从线程跳转到线程。线程,并且以一种完全超出您控制范围的方式。

关于java - ThreadLocal 反模式的替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17832253/

相关文章:

C++:当每个线程都应该同时执行 I/O 和 CPU 密集型任务时的多线程设计

java - relativelayout无法转换为textview

Java8 Lambda 表达式迭代枚举值并初始化最终成员

wait()可以代替sleep()或delay()吗?

c++ - 分析磁盘访问

c# - 这怎么不会在Silverlight中引起跨线程异常?

Java:存储为字符串时服务器响应被切断?

java - 在 J2SE 应用程序中查看 Commons Logging 调试消息

java - 根据屏幕分辨率加载图像的设计模式

design-patterns - 更新多个实体的方法通常不是 DAO 的一部分吗?