Как мне уведомить мой основной класс, который создает экземпляр ThreadPoolExecutor
, когда все потоки в ThreadPoolExecutor
завершены?
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
}
РЕДАКТИРОВАТЬ 1
Как мои потоки извлекают данные изгде-то и заполнить эту информацию в ConcurrentLinkedQueue Я в основном хотел бы выполнить какое-то действие в MyClass, чтобы обновить вывод XML с результатами.Когда все потоки завершены, я хотел бы вернуть true веб-службе JAX-RS, которая создала экземпляр MyClass, чтобы веб-служба знала, что все данные были выбраны, и теперь может отображать окончательный файл XML
EDIT 2
Я передаю Queue
потокам, чтобы они могли добавлять элементы в очередь.Когда один driver
завершает добавление элементов в articleQueue
, я хочу выполнить действие в своем основном классе, опрашивая сущность из Queue
и передавая ее объекту response
, чтобы каким-то образом отобразить его.
Когда я передаю очередь потокам, работают ли они с одним и тем же объектом или с «копией» объекта, чтобы изменения в потоке не влияли на основной объект?Это не то поведение, которое я хочу.Когда я проверяю размер articleQueue
в Driver
, он равен 18
, размер articleQueue
в DriverController
равен 0
.
Есть ли лучший способреагировать, когда поток добавил что-то в очередь, кроме моего цикла while?Как мне изменить мой код для доступа к одному и тому же объекту в разных классах?
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());
}
}
}
}
Driver
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 ...
}
}