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

标签 java multithreading google-app-engine thread-safety httprequest

我有一个带有 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/

相关文章:

java - 在Java中将字符串插入字节数组中的某个索引处

java - 转换 vaadin 中 DateField 的值

java - 删除文件(奇怪的扩展名)

multithreading - Python 3 concurrent.futures 和每线程初始化

c# - 发送大量数据时“连接被远程主机强行关闭”

google-app-engine - 五个不同的 GAE 站点可以共享一个公共(public)数据存储吗?

java - java "unmanaged"代码可以通过 [DllImport] 属性导入到 C# 中吗?

python - Django 1.1 和 Google 应用引擎有稳定的集成程序/插件吗?

python - OpenID 认证 : which method to get a unique identifier to use as key?

c++ - 我无法通过 C++ 中的函数式编程重现函数内存