code: public CompilerThread grabCompilerThread() throws InterruptedException {
          available.acquire();
          if (compilers.empty()) {
              return new CompilerThread(this);
          }
          return compilers.pop();
      }
docs: Acquire a compiler thread from the pool, or block until a thread is available.
  If the pools is empty, create a new thread, but never more than is "available".