import groovy.util.GroovyTestCase; import groovy.util.GroovyScriptEngine; import groovy.lang.*; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.atomic.AtomicBoolean; import java.io.IOException; import java.io.File; import junit.framework.Assert; /** * Tests for a concurrency problem detected when running the same script (with * dependencies) in multiple threads simultaneously (using the same * GroovyScriptEngine). * * @author Mattias Reichel mattias dot reichel at gmail dot com */ public class GroovyConcurrentTest{ // You have to change the script dir to suit your computer setup private static final String SCRIPT_DIR = "./"; public void testScriptCompilation() { GroovyScriptEngine scriptEngine = null; try { scriptEngine = new GroovyScriptEngine(SCRIPT_DIR); } catch (IOException ioe) { ioe.printStackTrace(); } final int threadCount = 100; for (int i = 0; i < threadCount; i++) { ScriptRunner runner = new ScriptRunner(scriptEngine, "script2.groovy"); ScriptRunner runner2 = new ScriptRunner(scriptEngine, "script3.groovy"); runner.start(); runner2.start(); } } public static class ScriptRunner extends Thread { private GroovyScriptEngine scriptEngine; private int index = 0; private String file = null; public ScriptRunner(GroovyScriptEngine scriptEngine, String file) { this.scriptEngine = scriptEngine; this.file = file; } public void run() { Binding binding = new Binding(); try { Object s = scriptEngine.run(this.file, binding); System.out.println("run :" + this.file + " result:" + s); } catch (Exception e) { e.printStackTrace(); } finally { } } } public static void main(String[] args) { GroovyConcurrentTest cct = new GroovyConcurrentTest(); cct.testScriptCompilation(); } }