@Override
		public void run() {
			if (!m_communicationShutdown) {
				try {
					final TestStatisticsMap sample = m_testRegistryImplementation.getTestStatisticsMap().reset();
					m_accumulatedStatistics.add(sample);

					// We look up the new tests after we've taken the sample to
					// avoid a race condition when new tests are being added.
					final Collection<Test> newTests = m_testRegistryImplementation.getNewTests();

					if (newTests != null) {
						m_consoleSender.send(new RegisterTestsMessage(newTests));
					}

					if (sample.size() > 0) {
						if (!m_reportTimesToConsole) {
							m_testStatisticsHelper.removeTestTimeFromSample(sample);
						}

						m_consoleSender.send(new ReportStatisticsMessage(sample));
					}

					sendStatusMessage(ProcessReport.STATE_RUNNING, m_threads.getNumberOfRunningThreads(),
							m_threads.getTotalNumberOfThreads());
				} catch (final CommunicationException e) {
					m_terminalLogger.info("Report to console failed", e);

					m_communicationShutdown = true;
				}
			}
		}
The application's main loop. This is split from the constructor as theoretically it might be
called multiple times. The constructor sets up the static configuration, this does a single
execution.
<p/>
<p>
This method is interruptible, in the same sense as
{@link net.grinder.util.thread.InterruptibleRunnable#interruptibleRun()}. We don't implement
that method because we want to be able to throw exceptions.
</p>

@throws net.grinder.common.GrinderException
         If something went wrong.
ngrinder-runtime/src/main/java/net/grinder/engine/process/GrinderProcess.java