@Override
		public int startThread(final Object testRunner) throws EngineException {
			final int threadNumber;
			synchronized (this) {
				threadNumber = ++m_i;
			}

			final ThreadContext threadContext = new ThreadContextImplementation(
					m_initialisationMessage.getProperties(), m_statisticsServices, threadNumber, m_dataLogger);

			final WorkerRunnableFactory workerRunnableFactory;

			if (testRunner != null) {
				workerRunnableFactory = new WorkerRunnableFactory() {
					@Override
					public WorkerRunnable create() throws EngineException {
						return m_scriptEngine.createWorkerRunnable(testRunner);
					}
				};
			} else {
				workerRunnableFactory = m_defaultWorkerRunnableFactory;
			}

			final GrinderThread runnable = new GrinderThread(m_logger, threadContext, m_threadSynchronisation,
					m_threadLifeCycleCallbacks, m_initialisationMessage.getProperties(), m_sleeper,
					workerRunnableFactory);

			final Thread t = new Thread(runnable, "thread " + threadNumber);
			t.setDaemon(true);
			t.start();

			return threadNumber;
		}
The number of worker threads that have been created but not run to completion.
ngrinder-runtime/src/main/java/net/grinder/engine/process/GrinderProcess.java