Не позволяйте нити взять на себя более одной задачи. Таким образом, любой поток, который завершает свою задачу, принимает очередную доступную задачу в очереди. Эти потоки не создаются новыми для каждой задачи, а вместо этого повторно используются, поэтому накладных расходов очень мало.
Рассмотрите - 2 потока имеют по 20 задач каждый, и вы хотите, чтобы второй поток выполнял задачи с первого, если он еще не закончен. Сравните это с тем, что 40 задач в очереди обслуживаются 2 потоками, что означает, что задачи всегда будут выполняться как можно быстрее без сложностей при попытке их перемещения между потоками.
Я не вижу логики в вопросе - если у вас есть группы задач, которые не могут быть многопоточными из-за проблем с секвенированием (это единственная причина, по которой я могу представить задачу, которая сама по себе является группой задачи в очередь), то у вас не может быть другого потока, обрабатывающего незавершенную обработку (потому что тогда последовательность всей группы будет нарушена).Если вам не требуется последовательная обработка, то бросьте все задачи в очередь и пусть они будут выполнены как можно скорее.
Если вы хотите, чтобы задачи из данной группы выполнялись раньше, назначьте их более высокий приоритет и используйте очередь приоритетов, обслуживаемую несколькими потоками.
посмотрите на [Исполнитель] (https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html) – jhamon
Вы описываете «кражу работы». [Javadoc for 'ForkJoinPool'] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ForkJoinPool.html) прямо заявляет, что он« отличается от других видов ExecutorService главным образом в силу использования кражи работы ». –
@ AndyTurner На самом деле, он просто хочет, чтобы задачи были назначены доступной нитью –