in core-it-support/core-it-plugins/maven-it-plugin-active-collection/src/main/java/org/apache/maven/plugin/coreit/CheckThreadSafetyMojo.java [74:154]
public void execute() throws MojoExecutionException {
Properties componentProperties = new Properties();
getLog().info("[MAVEN-CORE-IT-LOG] Testing concurrent component access");
ClassLoader pluginRealm = getClass().getClassLoader();
ClassLoader coreRealm = MojoExecutionException.class.getClassLoader();
final Map map = componentMap;
final List list = componentList;
final List go = new Vector();
final List exceptions = new Vector();
Thread[] threads = new Thread[2];
for (int i = 0; i < threads.length; i++) {
// NOTE: The threads need to use different realms to trigger changes of the collections
final ClassLoader cl = (i % 2) == 0 ? pluginRealm : coreRealm;
threads[i] = new Thread() {
private final ClassLoader tccl = cl;
public void run() {
getLog().info("[MAVEN-CORE-IT-LOG] Thread " + this + " uses " + tccl);
Thread.currentThread().setContextClassLoader(tccl);
while (go.isEmpty()) {
// wait for start
}
for (int j = 0; j < 10 * 1000; j++) {
try {
for (Object o : map.values()) {
o.toString();
}
for (Object aList : list) {
aList.toString();
}
} catch (Exception e) {
getLog().warn("[MAVEN-CORE-IT-LOG] Thread " + this + " encountered concurrency issue", e);
exceptions.add(e);
}
}
}
};
threads[i].start();
}
go.add(null);
for (Thread thread : threads) {
try {
thread.join();
} catch (InterruptedException e) {
getLog().warn("[MAVEN-CORE-IT-LOG] Interrupted while joining " + thread);
}
}
componentProperties.setProperty("components", Integer.toString(componentList.size()));
componentProperties.setProperty("exceptions", Integer.toString(exceptions.size()));
if (!outputFile.isAbsolute()) {
outputFile = new File(basedir, outputFile.getPath());
}
getLog().info("[MAVEN-CORE-IT-LOG] Creating output file " + outputFile);
OutputStream out = null;
try {
outputFile.getParentFile().mkdirs();
out = new FileOutputStream(outputFile);
componentProperties.store(out, "MAVEN-CORE-IT-LOG");
} catch (IOException e) {
throw new MojoExecutionException("Output file could not be created: " + outputFile, e);
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
// just ignore
}
}
}
getLog().info("[MAVEN-CORE-IT-LOG] Created output file " + outputFile);
}