package er.plugintest.tests; import java.util.ArrayList; import org.apache.commons.lang.RandomStringUtils; import org.apache.commons.lang.math.RandomUtils; import com.webobjects.foundation.NSArray; import er.extensions.eof.ERXEC; import er.plugintest.model.City; import er.plugintest.model.Country; public class MultithreadedTest extends PluginTest { public MultithreadedTest(String name) { super(name); } @Override protected void setUp() throws Exception { super.setUp(); resetData(); } public void testMutipleThreads() { ArrayList<QueryTask> qTasks = new ArrayList<MultithreadedTest.QueryTask>(); ArrayList<Thread> threads = new ArrayList<Thread>(); for (int i = 0; i < 25; i++) { QueryTask task = new QueryTask(); qTasks.add(task); new Thread(task, "QueryThread-" +i).start(); } for (int i = 0; i < 5; i++) { InsertTask task = new InsertTask(); threads.add(new Thread(task, "InsertThread-" + i)); } for (int i = 0; i < 5; i++) { UpdateTask task = new UpdateTask(); threads.add(new Thread(task, "UpdateThread-" + i)); } for (Thread thread : threads) { thread.start(); } for (Thread thread : threads) { try { thread.join(); } catch (InterruptedException e) { } } for (QueryTask task : qTasks) { task.setRun(false); } } public static class QueryTask implements Runnable { private boolean run = true; @Override public void run() { while (getRun()) { ERXEC ec = (ERXEC) ERXEC.newEditingContext(); ec.lock(); try { NSArray<City> cities = City.fetchCities(ec, City.NAME.likeInsensitive(RandomStringUtils.randomAlphabetic(1) + "*"), City.NAME.ascs()); } finally { ec.unlock(); } } } public synchronized void setRun(boolean run) { this.run = run; } public synchronized boolean getRun() { return run; } } public static class InsertTask implements Runnable { @Override public void run() { for (int i = 0; i < 25; i++) { ERXEC ec = (ERXEC) ERXEC.newEditingContext(); ec.lock(); try { Country country = Country.fetchAllCountries(ec).lastObject(); City city = City.createCity(ec, RandomStringUtils.randomAlphabetic(15)); city.setCountryRelationship(country); ec.saveChanges(); } finally { ec.unlock(); } } } } public static class UpdateTask implements Runnable { @Override public void run() { for (int i = 0; i < 25; i++) { ERXEC ec = (ERXEC) ERXEC.newEditingContext(); ec.lock(); try { City city = City.fetchCity(ec, City.NAME.eq("Amsterdam")); if (city != null) { city.setPopulation(RandomUtils.nextInt(3)); } ec.saveChanges(); } finally { ec.unlock(); } } } } }