Вы можете использовать CyclicBarrier, и каждый поток ожидает только, когда он имеет тип Y. Например.
ExecutorService executor = Executors.newFixedThreadPool(X.size);
public void executeAllAndAwaitCompletion(List<? extends Y> myRunnableY){
final CyclicBarrier barrier = new CyclicBarrier(myRunnable.size()+1);
for(final Y y : myRunnableY){
executor.submit(new Runnable(){
public void run(){
y.run();//for the sake of this example y has a run method
barrier.await();
}
});
}
barrier.await();
}
Таким образом, каждый поток, работающий с типом Y, будет ожидать, пока все эти Y не завершат работу.Обратите внимание, что вы должны добавить 1 к размеру барьера, чтобы учесть, что первоначально выполняющийся поток также должен ждать.
Также Примечание: Если пример Майкла Боргвардта работает для вас, это будет лучше.Однако, если вам нужен пул потоков, для каждого потока, на котором выполняется Y, чтобы не запускать другие не-Y, тогда мое решение будет единственным способом, которым вы можете это сделать.Future.get () будет блокировать только вызывающий поток, а когда пул потоков завершит выполнение Y, он затем подхватит какую-то другую (возможно, не Y) задачу.