Java: notifique a la clase principal cuando todos los subprocesos en el grupo de subprocesos hayan terminado / la misma instancia de objeto en subprocesos diferent
¿Cómo notifico a mi clase principal que instancia unaThreadPoolExecutor
cuando todos los hilos dentro de laThreadPoolExecutor
están completos?
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 1Wile my, los subprocesos obtienen datos de alguna parte y llenan esta información en un ConcurrentLinkedQueue. Básicamente me gustaría realizar alguna acción en MyClass para actualizar la salida XML con los resultados. Cuando se terminan todos los subprocesos, me gustaría volver verdadero al servicio web JAX-RS que instanciaba MyClass para que el servicio web sepa que se han obtenido todos los datos y ahora puede mostrar el archivo XML final
EDIT 2 Estoy pasando unQueue
a los subprocesos para que puedan agregar elementos a la cola. Cuando unodriver
ha terminado de agregar elementos a laarticleQueue
Quiero realizar una acción dentro de mi clase principal, sondear la entidad desde laQueue
y entregárselo a laresponse
objeto para mostrarlo de alguna manera.
Cuando paso la cola a los hilos, ¿están trabajando con el mismo objeto o con una "copia" del objeto para que los cambios dentro del hilo no afecten al objeto principal? Ese no es el comportamiento que quiero. Cuando verifico el tamaño de laarticleQueue
dentro deDriver
está18
, el tamaño de laarticleQueue
en elDriverController
es0
.
¿Hay una mejor manera de reaccionar cuando un hilo ha agregado algo a la cola que no sea mi ciclo while? ¿Cómo debo modificar mi código para acceder al mismo objeto dentro de diferentes clases?
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());
}
}
}
}
Conductopublic 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 ...
}
}