def future(*args, &block)
      promise = Promise.new(args, &block)
      promise.recorder = lambda { |*stats| stat(*stats) }

      @queue.enq promise
      stat :queued, item_id: promise.object_id
      start_thread
      promise
    end
def future(*args, &block)
      promise = Promise.new(args, &block)
      promise.recorder = lambda { |*stats| stat(*stats) }

      @queue.enq promise
      stat :queued, item_id: promise.object_id
      start_thread
      promise
    end
:nodoc: all
 Creates a ThreadPool object.  The +thread_count+ parameter is the size
 of the pool.
 Creates a future executed by the +ThreadPool+.

 The args are passed to the block when executing (similarly to
 Thread#new) The return value is an object representing
 a future which has been created and added to the queue in the
 pool. Sending #value to the object will sleep the
 current thread until the future is finished and will return the
 result (or raise an exception thrown from the future)