public void Consume(Job job)
        {
            Debug.Assert(HasAvailableWorkers, "Doesn't have available workers!");
            if (!HasAvailableWorkers)
                throw new InvalidOperationException("Hey! We're busy! Check HasAvailableWorkers value first!");

            Interlocked.Increment(ref mNumOfActiveWorkers);
            if (JobStarted != null)
                JobStarted(this, job);

            // Invoke job in a different thread
            // TODO: Cache threads and pass the job in the parameters
            Thread jobThread = new Thread(new ThreadStart(() => {
                job.Invoke();

                if (JobFinished != null)
                    JobFinished(this, job);
                Interlocked.Decrement(ref mNumOfActiveWorkers);
            }));

            jobThread.Start();
        }