Run jobs on a limited number of threads and support data dependencies