public void Run(NumberReader reader)
        {
            var results = new List<long>();
            var numbersToCheck = new BoundBuffer<long>();
            RwLock _wlock = new RwLock();

            StartComputationThreads(results, numbersToCheck);

            var progressMonitor = new ProgressMonitor(results);

            new Thread(progressMonitor.Run) {IsBackground = true}.Start();

            _wlock.WriteLock();
            foreach (var value in reader.ReadIntegers()) {
                numbersToCheck.Enqueue(value);                //critical section
            }

            while (numbersToCheck.Count() > 0)
            {
                Thread.Sleep(100); // wait for the computation to complete. New Lock?
            }

            Console.WriteLine("{0} of the numbers were prime", progressMonitor.TotalCount);
            _wlock.WriteUnLock();
        }