code: private void createTables(Collection<HTableDescriptor> tableDescriptors)
        throws InterruptedException {
      try {
        Set<String> tablesCreated = Sets.newHashSet();
        Multimap<String, HTableDescriptor> pendingTableUpdates = ArrayListMultimap
            .create();
        for (HTableDescriptor tableDescriptor : tableDescriptors) {
          String tableName = Bytes.toString(tableDescriptor.getName());
          if (tablesCreated.contains(tableName)) {
            // We have to wait for the table async creation to modify
            // Just add the required columns to be added
            pendingTableUpdates.put(tableName, tableDescriptor);
          } else {
            LOG.info("Creating table " + tableName);
            hbaseAdmin.createTableAsync(tableDescriptor, new byte[][] {});
            tablesCreated.add(tableName);
          }
        }
  
        // Wait for the tables to be online
        for (int waitCount = 0;
             waitCount < MAX_SECOND_WAIT_FOR_TABLE_CREATION; waitCount++) {
          Iterator<String> iterator = tablesCreated.iterator();
          while (iterator.hasNext()) {
            String table = iterator.next();
            if (hbaseAdmin.isTableAvailable(table)) {
              // Perform any updates scheduled on the table
              if (pendingTableUpdates.containsKey(table)) {
                for (HTableDescriptor tableDescriptor : pendingTableUpdates
                    .get(table)) {
                  // Add the new columns - synchronous calls
                  modifyTable(table, tableDescriptor);
                }
              }
              iterator.remove();
            }
          }
          // If all tables are available, then break
          if (tablesCreated.isEmpty()) {
            break;
          }
          // Sleep for a second before checking again
          Thread.sleep(1000);
        }
      } catch (IOException e) {
        throw new DatasetException(e);
      }
    }
docs: Create the tables asynchronously with the HBase