Java POJO: стратегии для обработки очереди объектов запроса на сервер - PullRequest
0 голосов
/ 12 апреля 2011

Прямо сейчас я разрываюсь с выбором лучшего способа обработки объектов запроса, которые отправляю на сервер.Другими словами, в моем приложении отслеживаются объекты запросов на такие вещи, как показы и отслеживание кликов.Простые запросы с очень низкой полезной нагрузкой.В моем приложении есть места, в которых указанные объекты, которые необходимо отслеживать, появляются одновременно рядом друг с другом (не более трех одновременных объектов, которые я должен отслеживать), поэтому каждый раз, когда указанные объекты видны, например, я должен создать запрос отслеживанияобъект для каждого из них.

Теперь я уже знаю, что могу легко создать поток одноэлементной очереди, который добавляет эти объекты в вектор, и мой поток либо обрабатывает их в основном цикле, либо вызывает в очереди ожидания, пока у нас не появятся объекты для обработки.Хотя это звучит как четкое решение, очередь может накапливаться в десятки, что иногда может быть громоздким, поскольку она устанавливает одно соединение для каждого запроса, поэтому не будет работать одновременно.

То, что у меня быломы имели в виду создание пула потоков, который позволил бы мне создать два одновременных соединения через семафор и объекты потока процесса, которые содержали бы мои запросы отслеживания событий.Другими словами, я хотел создать функцию, которая создаст новый объект потока и добавит его в вектор, в котором пул потоков будет перебирать набор потоков и обрабатывать их по два за раз.Я знаю, что могу создать функцию, которая бы добавляла объекты следующим образом:

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;
 }
}

1 Ответ

0 голосов
/ 12 апреля 2011

Что бы вы хотели сделать, чтобы на стороне потока каждый поток ожидал в очереди. Например

class MyWaitingThread extends Thread{

   private final Queue _queue;
   public MyWaitingThread (Queue _queue){
      this._queue = _queue;
   }
   public void run(){
      while(true){
       Runnable r = null;
       synchronized(_queue){
            if(_queue.isEmpty())
                _queue.wait();
            else
               r = queue.pop();
        }
      if(r != null) r.run();
      }
   }
}

А в другой вашей логике это будет выглядеть так:

public void addThread(Runnable r){
     if(!dead){
       synchronized(_queue){
         _queue.addElement(r);
         _queue.notifyAll();
       }
     }
}

То, что _queue.notifyAll разбудит все потоки, ожидающие на экземпляре _queue. Также обратите внимание, что я переместил while(!dead) за пределы синхронизированного блока и изменил его на if(!dead). Я могу себе представить, чтобы все было так, как у вас изначально было, и не работало бы так, как вы надеялись.

...