【发布时间】:2019-05-23 10:45:09
【问题描述】:
背景:我正在并行运行自动化测试。多个浏览器在相同数量的线程中启动,即 1 个浏览器是 1 个线程,使用 pom.xml 中的分叉。
pom.xml 中的以下插件创建与线程(fork)计数相同数量的Parallel**IT.class。
所有这些类都是同时并行执行的。因此,似乎每当我创建 volatile variable 或 AtomicInteger 时,每个线程都会创建自己的这些,因此跨多个线程共享变量的概念不起作用。
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${maven.failsafe.plugin}</version>
<configuration>
<systemPropertyVariables>
<webdriver.base.url>${webdriver.base.url}</webdriver.base.url>
</systemPropertyVariables>
<argLine>
-javaagent:${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar
</argLine>
<forkCount>5</forkCount>
<reuseForks>true</reuseForks>
<includes>
<include>**/Parallel*IT.class</include>
</includes>
<perCoreThreadCount>true</perCoreThreadCount>
<properties>
<property>
<name>listener</name>
<value>ru.yandex.qatools.allure.junit.AllureRunListener</value>
</property>
</properties>
</configuration>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
我只希望 1 个线程访问“准备测试数据”功能并将 flag 设置为 false,当其他线程将 flag 视为 false 时,它们不会尝试准备测试数据。
我正在按照教程https://www.youtube.com/watch?v=WH5UvQJizH0 使用volatile 变量来实现synchronization。也许我犯了一些错误,但所有线程都在打印System.out.println("Preparing test data");
尝试一:易失性和同步性
volatile boolean flag = false;
public synchronized void setFlagTofalse(){
System.out.println("Inside sync block");
this.flag = true;
}
// works before class only once
private EventHandler<TestRunStarted> prepareTestData = event -> {
if(flag==false) {
System.out.println("Preparing test data");
setFlagTofalse();
}
};
尝试 2:原子和同步
AtomicInteger flag = new AtomicInteger(0);
private EventHandler<TestRunStarted> prepareTestData = event -> {
if(flag.get()==0) {
System.out.println("Preparing test data");
value.incrementAndGet();
}
【问题讨论】:
-
请使用minimal reproducible example 更新您的问题。您的某些答案不起作用的各种 cmet 表明缺少某些上下文。
-
缺少什么上下文?我会尝试更新,请至少提出您的猜测。
-
首先,包含这些标志和方法的类。它们是如何被调用或启动的,等等。
-
这在多线程和并行执行的情况下很明显,但还是让我把它放在问题描述中。
-
这不是很明显,否则我不会问。这里的所有答案都假设这是一个将由所有线程共享的单个实例,但情况似乎并非如此。
标签: java multithreading synchronization atomic