Merge pull request #2413 from RosettaCommons/aleaverfay/jd3_multithreaded_jd_take3
I've extracted the rather complex logic of asking the JobQueen for the next job to run out of the MPIWorkPoolJobDistributor and into a new class, the JobExtractor. I've replaced the original logic from the MPIWorkPoolJobDistributor with the JobExtractor class, and that looks like it works just fine.
So writing the (single-process) MultiThreadedJobDistributor then becomes very easy: pop a job from the Extractor, put it into a work-queue, let a thread pool get to it when the next thread becomes available.
This implementation makes use of the Apache2-licensed C++ Thread Pool Library (CTPL); it works incredibly smoothly.