Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 回调中的Threadlocal用法_Java_Multithreading_Thread Local - Fatal编程技术网

Java 回调中的Threadlocal用法

Java 回调中的Threadlocal用法,java,multithreading,thread-local,Java,Multithreading,Thread Local,我在阅读ThreadLocal课程时,多次看到Joshua Bloch的以下陈述 通过不受控制的回调来“筛选”值:有时必须调用一个库方法,该库方法会回调到包中。此时,您需要一些由于库中的缺陷而无法传递给自己的上下文。在这种罕见的情况下,线程局部变量可以成为救星 如果有人能详细说明和解释,我将不胜感激 谢谢..Heena我的应用程序调用了一个搜索存储数据的库 该库还有一个可以实现的接口,告诉它如何将搜索的原始结果转换为所需的数据格式 我实现了如何将搜索结果转换成我想要的对象,这涉及到知道一个特定的

我在阅读ThreadLocal课程时,多次看到Joshua Bloch的以下陈述

通过不受控制的回调来“筛选”值:有时必须调用一个库方法,该库方法会回调到包中。此时,您需要一些由于库中的缺陷而无法传递给自己的上下文。在这种罕见的情况下,线程局部变量可以成为救星

如果有人能详细说明和解释,我将不胜感激


谢谢..Heena

我的应用程序调用了一个搜索存储数据的库

该库还有一个可以实现的接口,告诉它如何将搜索的原始结果转换为所需的数据格式

我实现了如何将搜索结果转换成我想要的对象,这涉及到知道一个特定的时区

所以这个过程是,(A)我调用库搜索方法,(B)搜索方法然后调用另一段代码,将原始结果转换为我的格式,(C)我的转换需要知道时区。挑战在于如何使我在A点知道的信息、时区在C点可用


显然,该库提供的方法不包括传递时区,因此我将其放在ThreadLocal中

假设您调用了第三方函数,该函数稍后会回调到您的代码中。在回调中,您需要一些上下文,即能够访问您的回调函数的一些变量。但是,第三方函数的不足之处在于它无法通过其代码将对象引用传递到回调中

你打算怎么办

不幸的是,除了将上下文存储在一个有效的全局变量中之外,您真的没有太多选择(哦,恐怖!)
ThreadLocal
是对全局变量的一种轻微改进,因为使用这种方法的多个线程不会互相攻击

当然,如果回调发生在与调用第三方函数的线程不同的线程上,那么这种技术就会失效


而且,这种技术无法扩展。如果同时注册两个回调,则需要两个不同的回调函数和两个不同的全局上下文。

我认为您的问题标题不太合适。尝试更改它以指定您的问题。Thread local var是一种“静态”值,仅在给定线程的上下文中是静态的,因此您可以用任何方法设置它,然后在任何其他方法中读取值,但在同一执行流中。@ivanovic Done..希望它现在合适。@fatfredyy很抱歉,它与我试图理解的语句有什么关系。threadlocal是为每个线程定义的局部变量,在某些情况下,我们需要线程携带一些信息,TreLead是这个问题的答案,把它看作是每个线程只能由所有者线程访问的局部变量。库的不足之处在于它不包括你的总体流需要的时间区的传递(C),而你需要的上下文是线程区保持时区。因此,这意味着ThreadLocal对象有助于/保存应用程序其他部分可以使用的信息。如果我错了,请纠正我。在大多数情况下,我不会将其称为缺陷。如果每个提供扩展点的框架都提供了额外的方法参数,以便在需要时偶尔在不同的上下文级别传递任意应用程序数据。。。那将是一些令人讨厌的API;)有时,它会出现在框架内,由注释处理器触发,因此提供运行时信息的实用方法不多。(看着你JAXB。)同意:)但是考虑到ThreadLocal变量可能导致的泄漏是危险的(阅读Tomcat容器场景)…对于这种情况,我们有更好的替代方案吗?我认为人们过于偏执,因为有一篇老文章是IBM的家伙写的,他说他们的web容器在线程管理方面糟糕透顶,用词好像这是一个普遍的真理。这可能就是我:)+1指出了不同线程上回调的问题。不提供用于回调的上下文指针是愚蠢的-您可能不知道哪个线程将执行回调,因为任务排队到一个池中。