我正在尝试执行以下代码:
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
?
根据我的理解,“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了。 首先我们来看一