public void executeWithoutRejection(Runnable runnable) throws NullPointerException, InterruptedException {
         if (runnable == null) {
            throw new NullPointerException();
        }

         if (_measureTaskArrivalRate) {
             _incomingTasks.incrementAndGet();
         }

        if (_measureTaskLatency || _measureQueueLatency) {
            final long enqueue = System.nanoTime();
            final Runnable r = runnable;
            runnable = new Runnable() {
                    public void run() {

                        if (_measureQueueLatency) {
                            _queueLatencies.get().sample(System.nanoTime() - enqueue);
                        }

                        try {
                            r.run();
                        } finally {
                            if (_measureTaskLatency) {
                                _taskLatencies.get().sample(System.nanoTime() - enqueue);
                            }
                        }
                    }
                };
        }

        if (!_queue.offer(runnable) || _workers.isEmpty()) {
            startWorker();
            _queue.put(runnable);
        }
    }