public void start() {
   if (_thread == null || !_thread.isAlive()) {
     reset();
     _thread = new DataThread<V>(this);
     _thread.start();
   }
 }
 public void stop() {
   if (_thread != null && _thread.isAlive()) {
     _thread.terminate();
     try {
       _thread.join();
     } catch (InterruptedException e) {
       log.warn("stopping interrupted");
     }
   }
 }
 public long getEventCount() {
   DataThread<V> thread = _thread;
   if (thread != null) return _thread.getEventCount();
   else return 0;
 }
 public void resume() {
   if (_thread != null) {
     _thread.resumeDataFeed();
   }
 }
 public void pause() {
   if (_thread != null) {
     _thread.pauseDataFeed();
   }
 }
 public String getStatus() {
   DataThread<V> thread = _thread;
   if (thread == null) return "dead";
   return thread.getStatus() + " : " + thread.getState();
 }
 public void setMaxEventsPerMinute(long maxEventsPerMinute) {
   DataThread<V> thread = _thread;
   if (thread == null) return;
   thread.setMaxEventsPerMinute(maxEventsPerMinute);
 }
 public long getMaxEventsPerMinute() {
   DataThread<V> thread = _thread;
   if (thread == null) return 0;
   return thread.getMaxEventsPerMinute();
 }
 public void syncWthVersion(long timeInMillis, long version) throws ZoieException {
   _thread.syncWthVersion(timeInMillis, version);
 }