gpt4 book ai didi

java - 请求线程是否在 http 请求之间重用?

转载 作者:行者123 更新时间:2023-11-29 05:55:45 25 4
gpt4 key购买 nike

我有一个带有 true 的 java appengine 应用程序。我知道多个线程将在处理多个并发请求的单个实例上运行。我知道代码必须是线程安全的,即没有全局静态变量。

我不明白的是请求结束时线程是否被杀死,或者同一个线程是否可以在处理完一个请求后用于处理另一个传入请求。

为什么这很重要?一些细节:

我有一个带有线程局部变量的静态类:

public abstract class Foo {
private static final ThreadLocal<Boolean> threadIsApiCall = new ThreadLocal<Boolean>();
static {
setIsApiCall(false);
}
}

这个变量存储了这个线程的当前请求是对我们的rest api的调用还是来 self 们自己的自定义客户端的调用。仅当与我们的 api 路径匹配的过滤器运行时,才会设置此变量。我遇到的问题是,如果向我们的 API 发出请求,并且 threadlocal 变量设置为 true,则在后续请求(不是 api 请求)中,threadlocal 变量仍设置为 true。你会怀疑它会因为静态初始值设定项而被设置为 false。它仍然可以设置为 true 的唯一方法是如果初始化程序不运行,这让我相信线程被重用。这是真的吗?

最佳答案

线程重用是servlet实现的一个实现细节。线程通常通过线程池重用。这通常可以通过 servlet 配置进行配置。不幸的是,GAE 并非如此。

您可以通过记录 Thread.currentThread().getName() 来简单地检查 GAE 是否回收线程。

由于可能的线程重用,在 servlet 中使用 ThreadLocal 始终不是一个好主意。如果您需要在请求范围内存储一些数据,请使用 servletRequest.setAttribute(..)

关于java - 请求线程是否在 http 请求之间重用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12189100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com