private static void TryMT(
            RegressionEnvironment env,
            int numInserted)
        {
            var path = new RegressionPath();
            var epl = "create table MyTable (key int primary key, p0 int);";
            env.CompileDeploy(epl, path);

            IList<BaseRunnable> runnables = new List<BaseRunnable>();

            var insertOutQ = new LinkedBlockingQueue<int>();
            var insert = new InsertRunnable(env, path, numInserted, insertOutQ);
            runnables.Add(insert);

            var selectOutQ = new LinkedBlockingQueue<int>();
            var select = new SelectRunnable(env, path, insertOutQ, selectOutQ);
            runnables.Add(select);

            var updateOutQ = new LinkedBlockingQueue<int>();
            var update = new UpdateRunnable(env, path, selectOutQ, updateOutQ);
            runnables.Add(update);

            IBlockingQueue<int> deleteOutQ = new LinkedBlockingQueue<int>();
            var delete = new DeleteRunnable(env, path, updateOutQ, deleteOutQ);
            runnables.Add(delete);

            // start
            var threads = new Thread[runnables.Count];
            for (var i = 0; i < runnables.Count; i++) {
                threads[i] = new Thread(runnables[i].Run);
                threads[i].Name = typeof(InfraTableMTGroupedFAFReadFAFWriteChain).Name + "-" + i;
                threads[i].Start();
            }

            // join
            foreach (var t in threads) {
                t.Join(TimeSpan.FromSeconds(60));
            }

            env.UndeployAll();

            // assert
            foreach (var runnable in runnables) {
                Assert.IsNull(runnable.Exception);
                Assert.AreEqual(
                    numInserted + 1,
                    runnable.NumberOfOperations,
                    "failed for " + runnable); // account for -1 indicator
            }
        }
        private void TryMT(int numInserted)
        {
            var epl = "create table MyTable (key int primary key, p0 int);";

            _epService.EPAdministrator.DeploymentAdmin.ParseDeploy(epl);

            var runnables = new List <BaseRunnable>();

            var insertOutQ = new LinkedBlockingQueue <int>();
            var insert     = new InsertRunnable(_epService, numInserted, insertOutQ);

            runnables.Add(insert);

            var selectOutQ = new LinkedBlockingQueue <int>();
            var select     = new SelectRunnable(_epService, insertOutQ, selectOutQ);

            runnables.Add(select);

            var updateOutQ = new LinkedBlockingQueue <int>();
            var update     = new UpdateRunnable(_epService, selectOutQ, updateOutQ);

            runnables.Add(update);

            var deleteOutQ = new LinkedBlockingQueue <int>();
            var delete     = new DeleteRunnable(_epService, updateOutQ, deleteOutQ);

            runnables.Add(delete);

            // start
            var threads = new Thread[runnables.Count];

            for (var i = 0; i < runnables.Count; i++)
            {
                threads[i] = new Thread(runnables[i].Run);
                threads[i].Start();
            }

            // join
            foreach (var t in threads)
            {
                t.Join();
            }

            // assert
            foreach (var runnable in runnables)
            {
                Assert.IsNull(runnable.Exception);
                Assert.AreEqual(numInserted + 1, runnable.NumberOfOperations, "failed for " + runnable);    // account for -1 indicator
            }
        }