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 1Enquanto 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
DriverControllerpublic 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());
}
}
}
}
Motoristpublic 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 ...
}
}