public void enqueue(T item)
  {
    boolean put = false;

    while (!put)
    {
      try
      {
        queue.put(item);
        put = true;
      }
      catch (InterruptedException exception)
      {
      }
    }

    synchronized (queue)
    {
      if (task == null || task.isDone())
      {
        task = pool.submit(new Runnable()
        {
          @Override
          public void run()
          {
            boolean done = false;

            while (!done)
            {
              try
              {
                T item = queue.poll(timeoutMillis, TimeUnit.MILLISECONDS);

                if (item == null)
                {
                  done = true;
                }
                else
                {
                  callback.callIn(item);
                }
              }
              catch (InterruptedException exception)
              {
              }
              catch (Exception exception)
              {
              }
            }

            synchronized (queue)
            {
              task = null;
            }
          }
        });
      }
    }
  }