当前位置: 首页 > 知识库问答 >
问题:

子线程未继承InheritableThreadLocal变量值

闾丘朗
2023-03-14

我正在尝试执行以下代码:

public class Basecl
{

    public static InheritableThreadLocal<Integer> myValue = new InheritableThreadLocal<Integer>();
    
    public void setMyValue(Integer i)
    {
        myValue.set(i);
    }

    public Integer getMyValue()
    {
        return myValue.get();
    }

    @BeforeClass
    public void bClass(ITestContext context, XmlTest xt)
    {
        System.out.println("Before Class called - " + context.getName() + " - " + this.getClass().getName() + " - " +  "Thread id: " + Thread.currentThread().getId());
        setMyValue(12);
    }

    @BeforeMethod
    public void bmeth1(ITestContext context, XmlTest xt, Method m, Object a[], ITestResult itr)
    {
        System.out.println("Before Method called - " + context.getName() + " - " + this.getClass().getName() + " - " + m.getName() + " - " + "Thread id: " + Thread.currentThread().getId());
    }

    @AfterMethod
    public void ameth1(ITestContext context, XmlTest xt, Method m, Object a[], ITestResult itr)
    {
        System.out.println("After Method called - " + context.getName() + " - " + this.getClass().getName() + " - " + m.getName() + " - " + "Thread id: " + Thread.currentThread().getId());
    }

}

上述类由测试类继承:

public class TC_009 extends Basecl
{

    @Test
    public void tCase3(ITestContext context, XmlTest xt)
    {
        System.out.println("My Value in testcase 3 is : " + getMyValue());
    }

    @Test
    public void tCase4(ITestContext context, XmlTest xt)
    {
        System.out.println("My Value in testcase 4 is : " + getMyValue());
    }

}

以下是testng.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name = "Suite" parallel = "methods" thread-count = "5" allow-return-values = "true" verbose = "0" configfailurepolicy = "continue">
<test name="Test1">
    <classes>
        <class name="testing.TC_009"/>
    </classes>
</test>
</suite>

我正在通过运行testng.xml文件并行执行上述测试方法。根据我的理解,可继承线程局部变量的值可以被子线程访问。但是当我执行上述测试类时,我观察到在测试方法tcase4中,可继承线程局部变量myValue的值为null。根据我的理解,“BeforeMethod”和“test方法”是BeforeClass方法的子线程。

以下是输出:

Before Class called - Test1 - testing.TC_009 - Thread id: 12
Before Method called - Test1 - testing.TC_009 - tCase3 - Thread id: 11
Before Method called - Test1 - testing.TC_009 - tCase4 - Thread id: 12
tCase4 called
tCase3 called
My Value in testcase 4 is : 12
My Value in testcase 3 is : null
After Method called - Test1 - testing.TC_009 - tCase4 - Thread id: 12
After Method called - Test1 - testing.TC_009 - tCase3 - Thread id: 11

那么,为什么可继承的线程局部变量myValue的值在测试方法tcase4中为null

共有1个答案

闻人栋
2023-03-14

根据我的理解,“BeforeMethods”和“test methods”是BeforeClass方法的子线程。

一点也不。

你没有解释你是如何并行运行这些测试的。

在任何情况下,IneliableThreadLocal并不意味着您认为它的意思。IneliableThreadLocal与普通的ThreadLocal相同:每个线程都有自己的变量版本。

一个微小的区别就是:普通的ThreadLocal实例默认为“默认值”(您可以在ThreadLocal的构造函数中配置此值,如果您未能做到这一点,则为null)。InheritableThreadLocals默认为生成新线程的线程的值。

所以,现在您调用线程。start(),此时将从您运行的线程中克隆该线程的本地线程值。从开始()。从那以后,它就有了自己的东西。

资料来源:阅读javadoc。

 类似资料:
  • 问题内容: 输出量 自333线程产生于444线程以来,我一直期待输出的最后一行出现“ NewInitialValue”,而tl是本地可继承线程。 是什么导致此问题,如何解决? 问题答案: 当您无法控制线程的创建时,您不应依赖。Javadoc指出: […]创建子线程时,子级将接收父级具有值的所有可继承线程局部变量的初始值。 在您的示例中,线程是由返回者创建的 那是一个执行程序,最多将使用两个线程来执

  • 是什么导致了这个问题,如何解决?

  • 我有一个超类看起来像这样 扩展类 科目类 尝试将从强制转换为时,出现无法强制转换的异常。 原因:java.lang.ClassCastException:com.example.bean.hrs.ProviderAccount无法强制转换为com.triphop.bean.hrs.CustomProviderAccount(位于com.triphop.service.hrsServiceImpl.

  • 问题内容: 我正在用Java 构建一个类。逻辑本身可以工作并找到期望的解决方案(带有任意数量的参数)。无论如何,部分项目如我所料。 问题来自解决方案表示的问题。可以公平地说,我已经用Python完成了这个项目,并决定尝试使用Java作为一种介绍,这可能是问题所在,我也想像Python一样这样做。 这是我的一些课程: 问题是它仍然从Operation类获取令牌:“ null” 我知道这可能是因为op

  • 我在Java实践继承,面临以下问题: 父类的代码: 子类代码: 两者是分开的。java文件。当我尝试执行父类文件时,它可以工作,但由于某些原因,我甚至无法运行子类。这里有以下信息: 该文件于2月8日发布。java不是可执行的。请选择要运行的主类 我该如何解决这个问题?

  • 本文向大家介绍java多线程编程之InheritableThreadLocal,包括了java多线程编程之InheritableThreadLocal的使用技巧和注意事项,需要的朋友参考一下 InheritableThreadLocal的作用: 当我们需要在子线程中使用父线程中的值得时候我们就可以像使用ThreadLocal那样来使用InheritableThreadLocal了。 首先我们来看一