Прямо сейчас я разрываюсь в выборе лучшего способа обработки объектов запросов, которые я отправляю на сервер. Другими словами, у меня есть объекты запроса отслеживания для таких вещей, как отслеживание показов и кликов в моем приложении. Простые запросы с очень низкой полезной нагрузкой. В моем приложении есть места, где указанные объекты, которые необходимо отслеживать, появляются одновременно рядом друг с другом (максимум три одновременных объекта, которые я должен отслеживать), поэтому каждый раз, например, когда указанные объекты видны, я должен создать запрос на отслеживание. объект для каждого из них.
Теперь я уже знаю, что могу легко создать одноэлементный поток очереди, который добавляет эти объекты в вектор, и мой поток либо обрабатывает их в основном цикле, либо вызывает ожидание в очереди, пока у нас не появятся объекты для обработки. Хотя это звучит как четкое решение, очередь может накапливаться в десятки, что иногда может быть громоздким, поскольку для каждого запроса выполняется одно соединение, поэтому она не будет выполняться одновременно.
Я имел в виду создание пула потоков, который позволил бы мне создать два одновременных соединения через семафор и обрабатывать объекты потока, которые будут содержать мои запросы отслеживания событий. Другими словами, я хотел создать функцию, которая создавала бы новый объект потока и добавляла его в вектор, в котором пул потоков перебирал бы набор потоков и обрабатывал бы их по два одновременно. Я знаю, что могу создать функцию, которая будет добавлять такие объекты:
public boolean addThread(Runnable r){
synchronized(_queue){
while(!dead){
_queue.addElement(r);
//TODO: How would I notify my thread pool object to iterate through the list to process the queue? Do I call notify on the queue object, but that would only work on a thread right??
return true
}
return false;
}
Мне интересно, как будут выполняться сами потоки. Как я могу написать функцию, которая будет выполнять пул потоков после добавления потока в список? Кроме того, поскольку семафор будет заблокирован после второго подключения, заблокирует ли это мое приложение до тех пор, пока не появится открытый слот, или он просто заблокируется в объекте пула потоков при циклическом просмотре списка?
Как всегда, поскольку я ориентируюсь на среду J2ME/Blackberry, будут приняты только ответы до версии 1.5, поэтому никаких дженериков или любого класса из пакета Concurrent.
РЕДАКТИРОВАТЬ: Итак, я так понимаю, что это должно выглядеть примерно так:
class MyThreadPool extends Thread{
private final Vector _queue = new Vector();
private CappedSemaphore _sem;
public MyWaitingThread (){
_sem = new CappedSemaphore(2);
this.start();
}
public void run(){
while(!dead){
Runnable r = null;
synchronized(_queue){
if(_queue.isEmpty()){
_queue.wait();
} else {
r = _queue.elementAt(0);
_queue.removeElement(0);
}
}
if(r != null){
_sem.take();
r.run();
_sem.release();
}
}
}
public boolean addThread(Runnable r){
synchronized(_queue){
if(!dead){
_queue.addElement(r);
_queue.notifyAll();
return true
}
return false;
}
}