Java: notifica a classe principal quando todos os threads no conjunto de threads são concluídos / mesma instância do objeto em threads diferent

Como notifico minha classe principal que instancia umThreadPoolExecutor quando todos os threads dentro doThreadPoolExecutor estão concluídos?

ThreadPoolExecutor threadPool = null;
ThreadClass threadclass1;
ThreadClass threadclass2;
final ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(maxPoolSize);

puclic MyClass(){
        threadPool = new ThreadPoolExecutor(poolSize, maxPoolSize, keepAliveTime, TimeUnit.SECONDS, queue);

        threadClass1 = new ThreadClass;
        threadClass2 = new ThreadClass;

        threadPool.execute(threadClass1);
        threadPool.execute(threadClass2);

        //Now I would like to do something until the threadPool is done working
        //The threads fill a ConcurrentLinkedQueueand I would like to poll
        //the queue as it gets filled by the threads and output 
        //it to XML via JAX-RS

}
EDIT 1

Enquanto isso, os threads buscam dados de algum lugar e preenchem essas informações em um ConcurrentLinkedQueue. Basicamente, eu gostaria de executar alguma ação no MyClass para atualizar a saída XML com os resultados. Quando todos os encadeamentos são encerrados, eu gostaria de retornar true ao serviço da web JAX-RS, que instancia o MyClass, para que o serviço saiba que todos os dados foram buscados e agora pode exibir o arquivo XML final

EDIT 2

Estou passando umQueue aos threads para que eles possam adicionar itens à fila. Quando umdriver é feito adicionando itens aoarticleQueue Quero executar uma ação dentro da minha classe principal, pesquisando a entidade a partir doQueue e entregá-lo aoresponse objeto para exibi-lo de alguma form

Quando passo a fila para os threads, eles estão trabalhando com o mesmo objeto ou com uma "cópia" do objeto, para que as alterações no thread não afetem o objeto principal? Esse não é o comportamento que eu quero. Quando verifico o tamanho doarticleQueue dentro doDriver isto é18, o tamanho doarticleQueue noDriverController é0.

Existe uma maneira melhor de reagir quando um thread adicionou algo à fila que não seja o loop while? Como preciso modificar meu código para acessar o mesmo objeto em diferentes classe

DriverController
public class DriverController {

    Queue<Article> articleQueue;

    ThreadPoolExecutor threadPool = null;
    final ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(
            maxPoolSize);

    public DriverController(Response response) {

        articleQueue = new ConcurrentLinkedQueue<Article>();
        threadPool = new ThreadPoolExecutor();
        Driver driver = new Driver(this.articleQueue);

        threadPool.execute(driver);
        // More drivers would be executed here which add to the queue

        while (threadPool.getActiveCount() > 0) {
            // this.articleQueue.size() gives back 0 here ... why?
            if(articleQueue.size()>0){
                response.addArticle(articleQueue.poll());
            }
        }

    }
}
Motorist
public class Driver implements Runnable{

    private Queue<Article> articleQueue;

    public DriverAlliedElectronics(Queue articleQueue) {
        this.articleQueue = articleQueue;
    }

    public boolean getData() {
        // Here would be the code where the article is created ...

        this.articleQueue.offer(article);
        return true;
    }

    public void run() {
        this.getData();
        // this.articleQueue.size() gives back 18 here ...

    }
}

questionAnswers(6)

yourAnswerToTheQuestion