Прямо сейчас я разрываюсь с выбором лучшего способа обработки объектов запроса, которые отправляю на сервер.Другими словами, в моем приложении отслеживаются объекты запросов на такие вещи, как показы и отслеживание кликов.Простые запросы с очень низкой полезной нагрузкой.В моем приложении есть места, в которых указанные объекты, которые необходимо отслеживать, появляются одновременно рядом друг с другом (не более трех одновременных объектов, которые я должен отслеживать), поэтому каждый раз, когда указанные объекты видны, например, я должен создать запрос отслеживанияобъект для каждого из них.
Теперь я уже знаю, что могу легко создать поток одноэлементной очереди, который добавляет эти объекты в вектор, и мой поток либо обрабатывает их в основном цикле, либо вызывает в очереди ожидания, пока у нас не появятся объекты для обработки.Хотя это звучит как четкое решение, очередь может накапливаться в десятки, что иногда может быть громоздким, поскольку она устанавливает одно соединение для каждого запроса, поэтому не будет работать одновременно.
То, что у меня быломы имели в виду создание пула потоков, который позволил бы мне создать два одновременных соединения через семафор и объекты потока процесса, которые содержали бы мои запросы отслеживания событий.Другими словами, я хотел создать функцию, которая создаст новый объект потока и добавит его в вектор, в котором пул потоков будет перебирать набор потоков и обрабатывать их по два за раз.Я знаю, что могу создать функцию, которая бы добавляла объекты следующим образом:
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, поэтому ни Generics, ни какой-либо класс из пакета 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;
}
}