code: @Override
    public void run(Context context) throws IOException, InterruptedException {
      outer = context;
      int numberOfThreads = getNumberOfThreads(context);
      mapClass = getMapperClass(context);
      if (LOG.isDebugEnabled()) {
        LOG.debug("Configuring multithread runner to use " + numberOfThreads + 
                  " threads");
      }
      
      runners =  new ArrayList<MapRunner>(numberOfThreads);
      for(int i=0; i < numberOfThreads; ++i) {
        MapRunner thread = new MapRunner(context);
        thread.start();
        runners.add(i, thread);
      }
      for(int i=0; i < numberOfThreads; ++i) {
        MapRunner thread = runners.get(i);
        thread.join();
        Throwable th = thread.throwable;
        if (th != null) {
          if (th instanceof IOException) {
            throw (IOException) th;
          } else if (th instanceof InterruptedException) {
            throw (InterruptedException) th;
          } else {
            throw new RuntimeException(th);
          }
        }
      }
    }
docs: Run the application's maps using a thread pool.