@Override
  public <Argument, Result, ReturnObject> RemoteFuture<ReturnObject> doJob(
      final Job<Argument, Result, ReturnObject> job) throws RemoteException {
    final PoolFinishedImpl<Argument> argumentPool = new PoolFinishedImpl<Argument>(_workers.size());
    job.split(argumentPool, _workers.size());
    final PoolImpl<Result> resultPool = new PoolImpl<Result>();
    System.out.println("Server: Start job. Workers: " + _workers.size());
    for (Worker w : _workers) {
      w.start(job.getTask(), argumentPool, resultPool);
    }
    System.out.println("All started.");

    /** start the merge observer */
    Thread mergeObserver =
        new Thread(
            new Runnable() {
              public void run() {
                try {
                  while (argumentPool.size() != -1) {
                    // System.out.println("Server: Arguments left: " +
                    // argumentPool.size());
                    try {
                      Thread.sleep(100);
                    } catch (InterruptedException e) {
                      // ignore
                    }
                  }
                  System.out.println("Server: Merge");
                  job.merge(resultPool);
                } catch (RemoteException e) {
                  e.printStackTrace();
                }
              }
            });
    mergeObserver.start();
    /** ********** */
    return job.getFuture();
  }