private void stopTasks(long token) {
   synchronized (tasks) {
     Iterator<SearchTask> it = tasks.iterator();
     while (it.hasNext()) {
       SearchTask task = it.next();
       if (token == -1L || task.getToken() == token) {
         task.stop();
       }
     }
   }
 }
 private int getOrder(long token) {
   int order = 0;
   synchronized (tasks) {
     Iterator<SearchTask> it = tasks.iterator();
     while (it.hasNext()) {
       SearchTask task = it.next();
       if (task.getToken() == token) {
         order = order + 1;
       }
     }
   }
   return order;
 }
  void checkIfFinished(SearchPerformer performer) {
    SearchTask pendingTask = null;

    synchronized (tasks) {
      Iterator<SearchTask> it = tasks.iterator();
      while (it.hasNext() && pendingTask == null) {
        SearchTask task = it.next();
        if (task.getToken() == performer.getToken() && !task.isStopped()) {
          pendingTask = task;
        }

        if (task.isStopped()) {
          it.remove();
        }
      }
    }

    if (pendingTask == null) {
      onFinished(performer.getToken());
    }
  }