替代反模式ThreadLocal?

时间:2013-07-24 11:09:32

标签: java multithreading design-patterns jboss

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

4 个答案:

答案 0 :(得分:5)

ThreadLocal是你故事中的一个侧面角色。您所听到的是异步请求处理,其中包括NIO库帮助。

在这种编程范例中,你没有像

那样的简单方法
Response processRequest(Request req)

相反,你得到了

void requestReceived(Request req, Response resp)

在此方法中,您通常只需通过准备后端请求并调用其方法来启动处理,该方法看起来像

execute(Query q, ResultCallback cb)

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

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

BTW这种编程风格的另一个名称是延续传递风格或CPS。这是因为当你调用一个函数时,你不会等待它的返回值,而是将一个回调函数传递给它,它将使用函数的结果调用,并实现总函数的 continuation 请求处理。

ThreadLocal如何适合此

如果你已经按照我上面所说的那样,你应该已经清楚,在这种请求处理方式中,ThreadLocal是一个无用的概念,因为请求处理自由地从一个线程跳转到线程,并且以一种完全不受你控制的方式。

答案 1 :(得分:0)

ThreadLocal基本上与数据库或ThreadPools / ExecutorServices无关。 ThreadLocal只是意味着存储在其中的值只对Thread可见,如何设置它。这不会导致任何阻塞。你必须在那里混淆一些东西。

  • ThreadLocal:按线程存储变量。
  • “新IO”:他们很可能意味着java.nio package。它关于读取/写入数据而不会阻塞。
  • Threadpools / Executorservice:您可以在其中提交Runnables的一堆线程。您可以在任何Java应用程序中使用ExecutorServices,因为它们是标准库的一部分。
  • 为了访问数据库,您通常使用像C3P0这样的专用系统来管理线程和数据库连接

答案 2 :(得分:0)

我认为我误解了这个问题。 好吧,我会详细解释我所听到的内容。 当使用ThreadLocal时。如果我们有一个对DataBase或JMS调用的查询。线程必须处于活动状态才能返回响应(例如假设需要15分钟)。线程将处于等待状态,等待Db返回响应。这对CPU和内存来说都是浪费。 新的线程管理技术使用一个线程池。实际上在等待时间。线程将用于服务另一个客户端。 这就是我所听到的。 致Marko Topolnik:你所暴露的是异步调用,它与Threads没有任何关系。

答案 3 :(得分:0)

ThreadLocals,线程池和新IO可以很好地协作。您所需要的只是在创建线程池时定义线程工厂,以便每个新线程在创建时获得正确的线程局部值。例如,该值可以保留对java.nio.channels.Selector单例的引用。另一个线程局部变量可以保存对线程池本身的引用,因此可以简化向线程池提交新任务的过程。

异步框架https://github.com/rfqu/df4j以这种方式集中使用线程本地。