Worker() {

            final boolean taskCompletionRate = _metrics.contains(Stats.Metric.TASK_COMPLETION_RATE);
            final boolean workerUtilization = _metrics.contains(Stats.Metric.UTILIZATION);

            Runnable runnable =
                new Runnable() {
                    public void run() {
                        try {

                            _birth = System.nanoTime();

                            while (!_isShutdown) {
                                Runnable r = (Runnable) _queue.poll(1000, TimeUnit.MILLISECONDS);

                                if (r != null) {
                                    _runnable = r;

                                    if (workerUtilization) {
                                        _start.set(System.nanoTime());
                                    }

                                    try {
                                        r.run();
                                    } catch (Throwable e) {

                                    } finally {
                                        _runnable = null;

                                        if (workerUtilization) {
                                            _totalDuration.addAndGet(System.nanoTime() - _start.getAndSet(0));
                                        }

                                        if (taskCompletionRate) {
                                            _completed.incrementAndGet();
                                        }
                                    }
                                }
                            }
                        } catch (InterruptedException e) {

                        }
                        _workers.remove(Worker.this);
                        _latch.countDown();
                    }
                };

            _thread = _threadFactory.newThread(runnable);
            _thread.start();
        }