public void put(Runnable o) throws InterruptedException
    {
        lock.lockInterruptibly();
        try {
            while(queue.remainingCapacity() <= 0) {
                queueNotFull.await();
            }
            queue.put(o);
            
            //now may need to signal hasAvailableRunnable
            ChannelsRunnable r = (ChannelsRunnable)o;
            if(!runningChannels.contains(r.getChannel()))
                hasAvailableRunnable.signal();
            
        } finally {
            lock.unlock();
        }
    }