code: public Future<?> submitAsynchronous(Object id, Runnable task) {
          lock.readLock().lock();
          try {
              int i = Math.abs(id.hashCode() % pools.length);
              return pools[i].submit(task);
          } catch (Exception e) {
              Log.error(e, "Task queue submission failed");
              throw new RuntimeException(e);
          } finally {
              lock.readLock().unlock();
          }
      }
docs: Submits a non value-returning task for asynchronous execution.
  <p/>
  The specified identifier is used to choose the thread executor where the task will be queued. The selection and
  load balancing is based in the {@link #hashCode()} of this identifier.
  
  @param id   The identifier of the task used to choose the thread executor where the task will be queued for
  asynchronous execution.
  @param task A task to be queued for asynchronous execution.